本文共 2681 字,大约阅读时间需要 8 分钟。
本文解析了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/