oracle 排序时最小项目不是第一个

wixjitnu  于 2023-03-17  发布在  Oracle
关注(0)|答案(1)|浏览(105)

下面是一个基本示例:

CREATE TABLE samuel(id varchar(1), field varchar(1));
INSERT INTO samuel VALUES ('1', ' ');
INSERT INTO samuel VALUES ('2', '&');

在使用Oracle 11.2.0.4.0执行SELECT id, field, DUMP(field) FROM samuel order by field;时,我得到:
| 识别号|领域|转储|
| - ------|- ------|- ------|
| 第二章|和|典型值=1长度=1:38|
| 1个||典型值=1长度=1:32|
但是当执行select id from samuel where field=(select min(field) from samuel);时,我得到1
以下是NLS设置:
| 参数|价值|
| - ------|- ------|
| NLS_语言|法语|
| NLS_区域|法国|
| NLS_货币|欧元|
| NLS_ISO_货币|法国|
| NLS数字字符|,|
| NLS_日历|格雷戈里安|
| NLS日期格式|年/月/日HH 24:MI:SS|
| NLS_日期_语言|法语|
| NLS分类|法语|
| NLS时间格式|HH24:MI:SSXFF|
| NLS时间戳格式|年/月/日HH 24:MI:SSXFF|
| NLS时间TZ格式|HH24:MI:SSXFF TZR|
| NLS时间戳TZ格式|年/月/日HH 24:MI:SSXFF TZR|
| NLS_双_货币|欧元|
| NLS_补偿|二进制|
| NLS长度语义|字节|
| NLS_NCHAR_转换器_排除|错误|
为什么会这样?

k4emjkb1

k4emjkb11#

你的资料显示你在法国。
给定设置:

ALTER SESSION SET NLS_LANGUAGE = 'French';
CREATE TABLE samuel(id varchar(1), field varchar(1));
INSERT INTO samuel VALUES ('1', ' ');
INSERT INTO samuel VALUES ('2', '&');

然后显示该语言的默认NLS设置:

SELECT * FROM NLS_SESSION_PARAMETERS;

包括:
| 参数|价值|
| - ------|- ------|
| NLS_语言|法语|
| NLS分类|法语|
| NLS_补偿|二进制|
然后:

SELECT id, field FROM samuel order by field;

输出:
| 识别号|领域|
| - ------|- ------|
| 第二章|和|
| 1个| |
如果强制排序顺序为二进制:

SELECT id, field FROM samuel order by NLSSORT(field, 'NLS_SORT=BINARY');

则输出为:
| 识别号|领域|
| - ------|- ------|
| 1个| |
| 第二章|和|
您需要确保根据所需的规则进行排序。如有必要,您可以用途:

ALTER SESSION SET NLS_SORT='BINARY';
  • (然而,这将对该会话中的所有查询使用二进制排序;而不仅仅是这一个查询。)*

然后:

SELECT id, field FROM samuel order by field;

输出:
| 识别号|领域|
| - ------|- ------|
| 1个| |
| 第二章|和|
fiddle

相关问题