首页 > 解决方案 > ORDER BY 子句中区分大小写的默认选项

问题描述

ORDER BY最近,我观察到该子句在区分大小写方面的奇怪行为。

一个非常简单的查询会根据数据库返回不同的结果:

SELECT company FROM DBT_COMPANY company ORDER BY company.name

我正在使用 Java EE + Hibernate + Oracle 11g/12c。

第一个数据库返回:

亚马逊

英国石油

α

第二个数据库返回:

α

亚马逊

英国石油

我知道我可以通过在语句中使用UPPER(company.name)or来解决问题。NLSSORT(company.name, 'NLS_SORT = BINARY_CI')但是,我不想在这些函数调用中乱扔我的 Hibernate 查询。

我很想知道,为什么两个数据库首先返回不同的结果。表或数据库级别的默认排序顺序是否有任何选项可能在此处配置错误?

标签: sqloraclehibernatesql-order-bycase-sensitive

解决方案


默认值为二进制,因此 sb 必须在其中一个数据库上更改它。它可以通过改变会话或初始化参数来改变。

alter session set NLS_COMP = 'ANSI';
alter session set NLS_SORT = 'BINARY_CI';
 
select * from (
select 'A' a from dual
union all
select 'B' from dual
union all
select 'a' from dual)
order by a;

--

alter session set NLS_COMP = 'BINARY';
alter session set NLS_SORT = 'BINARY';
 
select * from (
select 'A' a from dual
union all
select 'B' from dual
union all
select 'a' from dual)
order by a;

---

alter session set NLS_COMP = 'LINGUISTIC';
alter session set NLS_SORT = 'BINARY_CI';
 
select * from (
select 'A' a from dual
union all
select 'B' from dual
union all
select 'a' from dual)
order by a;

检查您的实例和会话的参数:

SELECT DB.PARAMETER, DB.VALUE "DATABASE", I.VALUE "INSTANCE", S.VALUE "SESSION" FROM NLS_DATABASE_PARAMETERS DB, NLS_INSTANCE_PARAMETERS I, NLS_SESSION_PARAMETERS S WHERE DB.PARAMETER=I.PARAMETER(+) AND DB.PARAMETER=S.PARAMETER(+) and db.parameter in ('NLS_SORT' , 'NLS_COMP'); 

如果实例参数和会话不同,则意味着您的 IDE(SQL Developer?PL/Developer?Toad?)更改了会话 NLS 参数。

SQL Developer -> 工具 -> 首选项 -> 数据库 -> NLS


推荐阅读