问题描述
最近,我观察到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