sql - 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 查询。
我很想知道,为什么两个数据库首先返回不同的结果。表或数据库级别的默认排序顺序是否有任何选项可能在此处配置错误?
解决方案
默认值为二进制,因此 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
推荐阅读
- javascript - 一段时间后如何解决 JS 承诺?
- android - 是否创建了多个 FirebaseMessagingService 实例来处理多个消息?
- php - 调用其他地方没有的变量
- node.js - Node.js 活动句柄突然上升
- java - 无论活动的生命周期如何,如何确保完成更新 firebase 数据库的过程
- html - 教程我遵循左“#”代替按钮中的链接。如果我想在实际服务器上托管它,我该如何解决?
- c# - .NET 4 中需要 MethodImpl(32) 吗?
- python - Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- android - Android 深度链接和启动模式
- javascript - jQuery 提取令牌并将其传递给 php 位置标头