【问题标题】:Oracle NLS_SORT not working via ALTER SESSION?Oracle NLS_SORT 不能通过 ALTER SESSION 工作?
【发布时间】: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 Collat​​ion 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


【解决方案1】:

这在我卸载 Oracle v11.2.0.3.0 并安装 v12.1.0.1.0 后得到解决。说实话,我不能排除这可能只是我们的 v11.2.0.3.0 Oracle 安装程序的包装器/配置或 Oracle 本身的问题。感谢所有帖子都一样。

【讨论】:

    【解决方案2】:

    解决办法是:

    1) Go to the REGISTRY (run regedit)
    2) Find HKEY_LOCAL_MACHINE/Software/ORACLE
    3) Change NLS_LANG
    

    我改成

    AMERICAN_AMERICA.AR8MSWIN1256
    

    不要忘记您必须在第 2 部分中更改所有 NLS_LANG。 现在您可以登录到您的数据库并对其进行测试。

    【讨论】:

    • 虽然这可能会提供正确的结果,但它并不能解决单个会话级别的问题。我们的应用程序会根据用户当前的语言环境更改 oracle 连接/会话的 NLS_SORT。
    猜你喜欢
    • 2018-07-01
    • 2019-11-30
    • 1970-01-01
    • 2014-11-26
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多