Oracle 排序顺序已更改

Jer*_*oen 5 oracle sorting oracle-12c natural-sort

我们最近使用较新版本的 Oracle (12c) 而不是 11r2 部署了一个新环境。

直到最近我才注意到我返回的数据的排序方式不同。

而不是有小写字母、大写字母和数字......(在 Oracle 11r2 上)我以相反的方式对我的数据进行排序:数字、大写字母、小写字母(Oracle 12c)

这确实让查询数据库的各种应用程序的最终用户感到困惑。我需要检查/比较哪些设置才能在 Oracle 12c 中解决此问题?

我提到的查询有一个 order by 子句。 编辑 这些参数的设置在两个环境上是相同的:

NLS_SORT 类型:字符串值:

nls_language 类型:字符串值:DUTCH

所以 NLS_SORT 没有值,那么默认值是多少?

@菲尔

select * from NLS_INSTANCE_PARAMETERS;

Parameter                     Oracle11r2          Oracle12c
NLS_LANGUAGE                       DUTCH              DUTCH
NLS_TERRITORY            THE NETHERLANDS    THE NETHERLANDS
NLS_SORT
NLS_DATE_LANGUAGE
NLS_DATE_FORMAT
NLS_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_ISO_CURRENCY
NLS_CALENDAR
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP                          BINARY           BINARY
NLS_LENGTH_SEMANTICS                BYTE             CHAR
NLS_NCHAR_CONV_EXCP                FALSE            FALSE

select * from NLS_SESSION_PARAMETERS;

these are the same as my NLS settings in Oracle SQL developer, so not very relevant I guess...

select * from NLS_DATABASE_PARAMETERS;
Run Code Online (Sandbox Code Playgroud)

这些都是一样的,只有 NLS_RDBMS_VERSION 不同

所以只有 NLS_LENGTH_SEMANTICS 不同。有没有办法检查其他会话的值?

小智 5

NLS_LANGUAGE 确定排序顺序。例如,如果您已从 FRENCH 变为默认的 AMERICAN,您会发现您描述的排序顺序有所不同。设置默认 NLS_LANGUAGE 执行

alter system set nls_language ='FRENCH' scope=spfile;
Run Code Online (Sandbox Code Playgroud)

并反弹实例。您始终可以在会话中使用

alter session set nls_language = 'FRENCH';
Run Code Online (Sandbox Code Playgroud)

反弹实例就是重新启动它。在更改某些系统参数(如 NLS_LANGUAGE)时,您需要这样做。如果您只更改当前会话中的参数,则不需要重新启动实例。

要检查参数值就可以了,就像菲尔所说,查询NLS_DATABASE_PARAMETERSNLS_INSTANCE_PARAMETERSNLS_SESSION_PARAMETERS。要检查当前会话中的设置,您还可以运行show parameter nls_language.