【发布时间】:2013-10-18 21:45:28
【问题描述】:
使用“alter session set nls_sort”似乎对我不起作用。我正在使用 SQLPlus v11.2.0.3.0 x64 并尝试应用 Oracle 文档中的“示例 9-10 NLS_SORT 影响语言排序顺序”的简单步骤http://docs.oracle.com/cd/E18283_01/appdev.112/e10766/tdddg_globalization.htm#CACJEJIB
CREATE TABLE temp (name VARCHAR2(15));
INSERT INTO temp (name) VALUES ('laguna');
INSERT INTO temp (name) VALUES ('llama');
INSERT INTO temp (name) VALUES ('loco');
SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_SORT';
Result: BINARY
SELECT * FROM temp ORDER BY name;
Result:
NAME
---------------
laguna
llama
loco
ALTER SESSION SET NLS_SORT=SPANISH_M;
SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_SORT';
Result: SPANISH_M
SELECT * FROM temp ORDER BY name;
Results are the same:
NAME
---------------
laguna
llama
loco
根据文档,上面的排序顺序应该已经改变,但它没有。但是,如果我将 NLS_SORT 作为查询本身的一部分应用,我会得到正确的结果:
SELECT * FROM temp ORDER BY NLSSORT(name, 'NLS_SORT=SPANISH_M');
Result:
NAME
---------------
laguna
loco
llama
我在这里缺少什么?提前谢谢。
【问题讨论】:
-
这是一个奇怪的问题。我无法在我的机器上或SQL Fiddle 上重现它。也许你遇到了一些奇怪的错误。您是否对不同的客户有同样的问题?您可能想发布您的客户端和数据库版本,以及来自
select name, value from v$parameter where name like '%nls%';的结果。 -
我无法复制它。我在 SQLPlus 和 SQLDeveloper 中尝试过。它应该真的有效。我的版本是
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0。 -
我也使用 11.2.0.2.0 让它工作。奇怪的是,它适用于使用 11.2.0.3.0 的一位同事,但不适用于另一位。我将尝试卸载/重新安装。
-
工作环境和不工作环境之间究竟有什么区别?这只是客户端的差异,还是不同服务器上的问题?如果是服务器问题,这是一个长期的问题,但您可能需要检查 Oracle Locale Builder。每个可以想象的 NLS 设置都是可配置的。 可能一台服务器有一个自定义的、损坏的 SPANISH_M 版本。如果您加载语言排序并查看 Unicode Collation Sequence,您将看到 LL 和 L 排序是如何实现的。它可能会让您了解如何进一步排除故障。
-
nls_language AMERICAN nls_territory AMERICA nls_sort BINARY nls_date_language AMERICAN nls_date_format DD-MON-RR nls_currency $ nls_numeric_characters ., nls_iso_currency AMERICA nls_calendar GREGORIAN nls_time_format HH.MI.SSXFF AM nls_timestamp_format DD-MON-RR nls_time_tz_format HH.MI.SSXFF AM TZR nls_timestamp_tz_format DD-MON-RR HH.MI.SSXFF AM TZR nls_dual_currency $ nls_comp BINARY nls_length_semantics BYTE nls_nchar_conv_excp FALSE
标签: sql oracle sorting sqlplus globalization