【问题标题】:Default option for case sensitivity in ORDER BY clauseORDER BY 子句中区分大小写的默认选项
【发布时间】:2021-01-27 01:20:18
【问题描述】:

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

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

SELECT company FROM DBT_COMPANY company ORDER BY company.name

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

第一个数据库返回:

亚马逊

英国石油

阿尔法

第二个数据库返回:

阿尔法

亚马逊

英国石油

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

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

【问题讨论】:

  • 数据库使用什么字符集?默认情况下,NLS_COMP 的值是多少?
  • 如何检查NLS_COMP的字符集和默认值?
  • 我已经和SELECT parameter, value FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT'); 核对过了。它在所有数据库上返回相同的设置。
  • 如果您说:当我手动运行 SELECT 语句时,两个数据库都按预期排序,我无法理解您为什么要查看数据库级别的一些设置。只有在 Hibernate 查询数据库时,项目顺序才会有所不同。
  • 您能否提供代码 sn-p 您如何从 java 运行查询以及您的休眠配置。

标签: sql oracle hibernate sql-order-by case-sensitive


【解决方案1】:

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

【讨论】:

  • 当我手动运行SELECT 语句时,两个数据库都按预期排序。只有在 Hibernate 查询数据库时,项目顺序才会有所不同。 NLS_COMPNLS_SORT 在数据库级别是否有任何永久选项?
  • 关于这个主题的好书(仅供参考):orafaq.com/node/999
  • 如何在“数据库”上运行查询? SQL Developer 或 TOAD 可以更改会话参数。 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(+) 和 db.parameter 在 ('NLS_SORT' , 'NLS_COMP');有比较实例参数和会话参数。也许你的 IDE 改变了参数(在 sql developer tools-Preferences->database->NLS)。
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 2022-01-08
  • 2013-03-24
  • 2023-03-27
  • 2016-11-02
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多