ORDER BY子句中区分大小写的默认选项

问题描述

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

一个非常简单的查询会返回不同的结果,具体取决于数据库

SELECT company FROM DBT_COMPANY company ORDER BY company.name

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

一个数据库返回:

亚马逊

英国石油

alpha

第二个数据库返回:

alpha

亚马逊

英国石油

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

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

解决方法

默认值为二进制,因此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'); 

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

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