[轉] 關於oracle 字符集(NLS_LANGUAGE)問題的探討



關於oracle 字符集(NLS_LANGUAGE)問題的探討
--------------------------------------------------------------------------------
nls_database_parameters、nls_instance_parameters、nls_session_parameters
--------------------------------------------------------------------------------


今天,在網上搜索關於nls視圖的相關內容,結果越查越糊塗,無奈下,還是自己動手做一下。

首先,我們看一下,這三個視圖的sql定義:

sys> select view_name,text from dba_views where view_name like 'NLS%'; 
     
VIEW_NAME                             TEXT 
------------------------- -------------------------------------------------- 
NLS_SESSION_PARAMETERS    select substr(parameter, 1, 30),  
                                                      substr(value, 1, 40)  
                                               from v$nls_parameters  
                                               where parameter != 'NLS_CHARACTERSET' and  
                                               parameter != 'NLS_NCHAR_CHARACTERSET'
     
NLS_INSTANCE_PARAMETERS   select substr(upper(name), 1, 30),  
                                                      substr(value, 1, 40)  
                                               from v$system_parameter  
                                               where name like 'nls%'
     
     
VIEW_NAME                               TEXT 
------------------------- -------------------------------------------------- 
NLS_DATABASE_PARAMETERS   select name,  
                                                 substr(value$, 1, 40)  
                                               from props$  
                                               where name like 'NLS%'

可以看出:

nls_database_parameters取值於props$, 即我們創建數據庫時存儲在數據庫中的信息,這與環境變量和參數文件等是統統沒有關系的。

nls_instance_parameters取值於v$system_parameter,下面讓我們看一下v$system_parameter 在官方文檔的定義:

V$SYSTEM_PARAMETER displays information about the initialization parameters that are currently in effect for the instance.

A new session inherits parameter values from the instance-wide values.

從這里,我們可知,nls_instance_parameters的值有參數文件決定,那么會不會受到環境變量的影響哪?

 

經驗證,是不會的!過程如下:

 

首先,我們來看一下NLS_LANGUAGE的取值

sys>select parameter,value from nls_instance_parameters where parameter='NLS_LANGUAGE'; 
     
PARAMETER                     VALUE 
------------------------------ ------------------------------ 
NLS_LANGUAGE               SIMPLIFIED CHINESE

 

關閉數據庫,然后修改環境變量NLS_LANG:

sys>shutdown immediate 

sys>exit  
 
[oracle@oadata ~]$ vi .bash_profile 
[oracle@oadata ~]$ . .bash_profile 
[oracle@oadata ~]$ set | grep NLS 
NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_LANG=AMERICAN_AMERICA.AL32UTF8

[oracle@oadata ~]$ sqlplus / as sysdba  
     
SQL> startup  

SQL> select parameter,value from nls_instance_parameters where parameter='NLS_LANGUAGE'; 
     
PARAMETER                     VALUE 
------------------------------ ------------------------------ 
NLS_LANGUAGE               SIMPLIFIED CHINESE

 

可見,nls_instance_parameters只受參數文件的影響,而不受環境變量影響。

nls_session_parameters取值於V$NLS_PARAMETERS, 它的查詢結果默認會從nls_instance_parameters繼承,但是如果,我們在環境變量或者

通過ALTER SESSION 改變了nls的相關參數,則會覆蓋默認值。

 

例如,當環境變量NLS_LANG=AMERICAN_AMERICA.AL32UTF8

SQL> select parameter,value from nls_session_parameters where parameter='NLS_LANGUAGE'; 
     
PARAMETER                     VALUE 
------------------------------ ------------------------------ 
NLS_LANGUAGE               AMERICAN

 

當環境變量NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'

SQL> select parameter,value from nls_session_parameters where parameter='NLS_LANGUAGE'; 
     
PARAMETER                     VALUE 
------------------------------ ------------------------------ 
NLS_LANGUAGE               SIMPLIFIED CHINESE

 

 

來源: csdn   作者:易點   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM