【发布时间】: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