Oracle NLS_SORT无法在系统级别上运行

时间:2012-11-22 11:08:01

标签: oracle sorting oracle11g nls

我正在使用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; 
它告诉我正确的顺序。

任何人都知道为什么sysem改变没有显示我正确的结果?

4 个答案:

答案 0 :(得分: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'
    
  4. 任何设置都会覆盖更高级别的设置。因此,设置服务器端并不能保证所有连接的客户端都使用该设置。

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

答案 1 :(得分:2)

全球化设置的优先级为shown in the documentation。您正在该列表中设置优先级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运行时给出正确的顺序,比如说 - 在其他地方使用时它们可能不起作用,比如说它有自己的语言环境设置。需要注意的事项。

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

答案 2 :(得分:1)

你的第二个“ALTER SYSTEM”命令(LINUGUISTIC而不是LINGUISTIC)中有一个拼写错误。

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

答案 3 :(得分:1)

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

事实上,我甚至可以说你最好不要使用设置系统级环境设置。