NLS引數優先順序解析

husthxd發表於2005-04-19

本文解析了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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章