NLS参数优先级解析

本文解析了NLS参数在C/S模式下的作用顺序。

可以在数据库、实例和会话级别上设置NLS参数。

如果在多个级别上均设置了NLS参数:

   1.NLS数据库参数优先级低于NLS实例参数

2.NLS数据库和实例参数优先级低于NLS会话参数

比如,在init.ora中设置了参数NLS_NUMERIC_CHARACTERS(point B),并且在客户端环境变量(point A)中也有设置,那么会话级的参数值会覆盖实例级的参数值。


译自Metalink Note 241047.1 The Priority of NLS Parameters Explained

A)会话级参数设置

通过以下查询

select * from NLS_SESSION_PARAMETERS;

获取会话级上的NLS参数设置.

1)通过“alter session ”命令修改NLS参数。比如:

alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY';

注意:通过after logon trigger也可以实现。

select OWNER, TRIGGER_NAME, TRIGGER_BODY

from DBA_TRIGGERS

where trim(TRIGGERING_EVENT) = 'LOGON';

参考Note 251044.1

2)如果没有显式通过“alter session”设置,那么会通过客户端的NLS_LANG设置相应的NLS参数。

NLS_LANG包括:NLS_LANG=_.

比如:

NLS_LANG=DUTCH_BELGIUM.WE8MSWIN1252

如何查询会话使用的NLS_LANG,参考Note 158577.1

3)如果NLS_LANG只是指定了,那么默认的为AMERICAN

注意NLS_LANG=_BELGIUM.WE8PC850而非NLS_LANG=BELGIUM.WE8PC850,”_”是必需的。

比如如果设置了NLS_LANG=_BELGIUM.WE8PC850

那么参数设置为:

PARAMETER                      VALUE

   ------------------------------ --------------

   NLS_LANGUAGE                   AMERICAN

   NLS_TERRITORY                  BELGIUM

   NLS_CURRENCY                  

   NLS_ISO_CURRENCY               BELGIUM

   ....

4)如果NLS_LANG只是指定了,那么会依据而变化。比如如果设置了NLS_LANG= ITALIAN_.WE8PC850

那么参数设置为:

PARAMETER                      VALUE

   ------------------------------ --------------

   NLS_LANGUAGE                   ITALIAN

   NLS_TERRITORY                  ITALY

   NLS_CURRENCY                  

   NLS_ISO_CURRENCY               ITALY

   .....

5)如果没有设置_,那么默认的是AMERICAN_AMERICA。

.NLS_COMP不能作为环境变量设置,必需通过alter session配置

比如,设置NLS_LANG=.WE8PC850

那么参数设置为:

PARAMETER                      VALUE

   ------------------------------ ----------

   NLS_LANGUAGE                   AMERICAN

   NLS_TERRITORY                  AMERICA

   NLS_CURRENCY                   $

   NLS_ISO_CURRENCY               AMERICA

   ....

6)设置了NLS_LANG仍然可以单独设置其他NLS参数,比如NLS_ISO_CURRENCY=FRANCE

NLS_LANG=AMERICAN_AMERICA.WE8PC850

那么参数设置为:

PARAMETER                      VALUE

   ------------------------------ -----------

   NLS_LANGUAGE                   AMERICAN

   NLS_TERRITORY                  AMERICA

   NLS_CURRENCY                   $

   NLS_ISO_CURRENCY               FRANCE

   ...

注意NLS_ISO_CURRENCY= FRANCE中的空格,虽然不会报错,但会忽略该参数。

默认值:

.如果NLS_DATE_LANGUAGE或者NLS_SORT没有设置,从NLS_LANGUAGE继承

.如果f NLS_CURRENCY, NLS_DUAL_CURRENCY, NLS_ISO_CURRENCY, NLS_DATE_FORMAT,NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT, NLS_NUMERIC_CHARACTERS没有设置,从NLS_TERRITORY中继承。

7)如果NLS_LANG没有设置,默认为_.US7ASCII,_的值为NLS_INSTANCE_PARAMETERS中的设置。在客户端单独设置的比如NLS_SORT等参数会被忽略。

.参数NLS_SESSION_PARAMETERS优先于NLS_INSTANCE_PARAMETERS和NLS_DATABASE_PARAMETERS

.不能从服务器端disabled该行为,所以客户端的参数设置通常会优于服务器端设置。

.NLS_LANG参数不能用alter session设置,而NLS_LANGUAGE和NLS_TERRITORY可以,但这两个参数不能作为单独的客户端NLS参数设置

.客户端NLS_LANG设置的字符集部分不会在任何系统表或视图中体现。

参考Note 158577.1中的4.2部分

.9i中NLS_LENGTH_SEMANTICS参数不能作为环境变量设置,10g可以

.NLS_NCHAR_CONV_EXCP不能作为环境变量设置,但可以使用alter session设置

.会话参数中的NLS_LANGUAGE同样作为错误信息的显示语言。参考Note 132090.1

.不能通过sql脚本设置NLS参数,必需通过alter session

B)实例级参数设置

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21779/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-21779/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值