1

我正在使用 oracle 11g r2,并尝试将 DB 配置为使用语言排序进行排序。我做了

alter system set NLS_SORT='RUSSIAN' SCOPE=SPFILE;
alter system set NLS_COMP='LINUGUISTIC' SCOPE=SPFILE;

在我重启oracle之后,我检查了这些参数:

show parameters NLS_SORT;
show parameters NLS_COMP;

它向我展示了正确的价值观。但是当我进行排序时

select name from test order by name; 

它显示我的结果顺序不正确,即先是数字,然后是字母。

但如果我愿意

alter session set nls_sort='RUSSIAN';
alter session set nls_comp='LINGUISTIC';
select name from test order by name; 

它向我展示了正确的顺序。

有谁知道为什么系统更改没有显示正确的结果?

4

4 回答 4

2

您可以设置不同级别的 NLS 参数

  1. 作为实例/服务器上的初始化参数。

    SQL> alter system set V$NLS_PARAMETER = 'XXX' scope = both;
    
  2. 作为客户端上的环境变量。

    % setenv NLS_SORT FRENCH
    
  3. 作为 ALTER SESSION 参数。

    SQL> ALTER SESSION SET V$NLS_PARAMETER =  = 'XXX'
    

任何设置都会覆盖更高级别的设置。因此,将其设置为服务器端并不能保证所有连接的客户端都使用该设置。

如果要确保为每个连接的客户端设置它,请使用登录触发器。即使这样,用户也可以显式覆盖“默认”设置

于 2012-11-22T12:25:39.903 回答
2

文档中显示了全球化设置的优先级。您在该列表中设置优先级 4,“在初始化参数文件中指定”。您没有设置优先级 1(“在 SQL 函数中显式设置”),当您设置优先级 2(“由 ALTER SESSION 语句设置”)时,您会得到所需的结果。通过排除过程,表明您的“不正确”顺序受到优先级 3“设置为环境变量”的影响。

您可以使用 . 检查会话实际使用的值select * from nls_session_parameters

NLS_SORT环境变量可能没有直接设置;我怀疑它是从 派生的NLS_LANGUAGE,它是从 派生的NLS_LANG。如果您没有在操作系统环境中明确设置它,那么客户端通常会根据操作系统区域设置进行设置,尽管您使用的确切客户端可能会产生显着差异。NLS_COMP如果数据库默认值确实被覆盖,您可能需要显式设置环境变量。

例如,SQL Developer 允许您在首选项中指定 NLS 设置(从 Tools->Preferences->Database->NLS 访问);默认值似乎基于操作系统设置,无论如何在 Windows 中。对于 SQL*Plus,您需要设置操作系统环境变量。

这也意味着,如果你让它在一个地方工作——比如说,当从 SQL Developer 运行时查询给出正确的顺序——它们在其他地方使用时可能无法工作,比如通过有自己的语言环境设置的 JDBC。只是需要注意的事情。

蛮力方法可能是将alter session命令添加到登录触发器,但这听起来并不理想,因为它只是掩盖了环境配置。

于 2012-11-22T12:27:21.820 回答
1

您在第二个“ALTER SYSTEM”命令(LINUGUISTIC 而不是 LINGUISTIC)中有错字。

如果您的实际命令不包含此错误,我将检查您的客户端是否将 NLS 会话参数设置为其他值。

于 2012-11-22T11:19:51.560 回答
1

无论系统设置如何,我都会尽一切努力确保您的应用程序完全指定它们所需的 NLS 环境。它更加健壮,特别是当您需要将应用程序代码指向可能是新设置或与其他系统共享的不同环境时。

事实上,我想说的是,您最好不要使用设置系统级环境设置。

于 2012-11-22T11:34:24.703 回答