oracle character

select * from nls_instance_parameters where parameter ='NLS_TERRITORY' or parameter ='NLS_LANGUAGE';linux

select * from nls_instance_parameters  where parameter ='NLS_TERRITORY' or parameter ='NLS_LANGUAGE';sql

select * from nls_database_parameters where parameter ='NLS_TERRITORY'or parameter ='NLS_LANGUAGE';

export  
NLS_LANG=.zhs16gbk 或者 LANG=zh_CN.zhs16gbk)不適用shell


RedHat linux AS4.0安裝了oracle10g,同時建立數據庫實例sc,後來又用dbca創建一個數據庫實例st,發如今oracle系統用戶下用sqlplus鏈接st實例時出現亂碼,應該是中文沒法顯示形成的,但鏈接sc實例時無亂碼,顯示英文。上網蒐集了一下資料,修改了oracle系統用戶的環境變量在.bash_profile中新增瞭如下內容解決:數據庫

export NLS_LANG=AMERICAN_AMERICA.UTF8
export.UTF-8

 
分析緣由:
windows

引用網上帖子:bash

oracle字符集問題通常能夠分爲三類: 數據庫字符集, sqlplus的字符集(客戶端字符集), 終端程序的字符集(非oracle的)。

一、數據庫字符集。
        數據庫字符集是全部字符問題的核心,只有數據庫自己的字符集正確了,客戶端的字符集纔可能正確。這裏只的客戶端包括sqlplus以及咱們本身讀數據庫的應用程序。
     在定位問題時,咱們須要先看看數據庫當前是什麼字符集。
    1)查詢數據庫字符集
       select * from nls_database_parameters
    其中 nls_language表示了顯示方式, 就是sqlplus的程序的顯示字體,有SIMPLIFIED CHINESE,American america
   其中  nls_characterset是字符集設定, 經常使用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8
   2)修改數據庫字符集
       當發現數據庫字符集不正確時,如咱們指望時GBK的,而數據庫當前是其餘的,從而引發中文亂碼。這時咱們須要修改數據庫字符集。步驟以下:
     $sqlplus /nolog
  SQL>conn / as sysdba;
  若此時數據庫服務器已啓動,則先執行SHUTDOWN IMMEDIATE命令關閉數據庫服務器,而後執行如下命令:
  SQL>STARTUP MOUNT;
  SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
  SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
  SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
  SQL>ALTER DATABASE OPEN;
  SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
  SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP

2 客戶端字符集
     
 若是服務器端的字符集是正確的,而在客戶端下,如sqlplus仍然不能正確顯示中文,這通常是因爲服務器端的字符集設定與客戶端的字符集設定不一樣形成的。只要將二者修改一致就能夠解決問題。
    1)查詢客戶端字符集
    select * from nls_instance_parameters
    客戶端字符集環境select * from nls_instance_parameters,其來源於v$parameter,
    表示客戶端的字符集的設置,多是參數文件,環境變量或者是註冊表
        select userenv('language') from dual;
    會話字符集環境 select * from nls_session_parameters,其來源於v$nls_parameters,表示會話本身的設置,多是會話的環境變量或者是alter session完成,若是會話沒有特殊的設置,將與nls_instance_parameters一致。 
    客戶端的字符集要求與服務器一致,才能正確顯示數據庫的非Ascii字符。若是多個設置存在的時候,alter session>環境變量>註冊表>參數文件
    字符集要求一致,可是語言設置卻能夠不一樣,語言設置建議用英文。如字符集是zhs16gbk,則nls_lang能夠是American_America.zhs16gbk。  或者.zhs16gbk。注意zhs16gbk前面那個點是必須的哦!!

   2) 修改客戶端字符集
oracle 的sqlplus會去讀取OS中環境變量下的nls_lang信息(關鍵在這裏,經過以上命令查看服務器

select * from nls_database_parameters 顯示session

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_CURRENCY                   $   
oracle

 

select * from nls_instance_parameters 顯示工具

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT                                                       
NLS_CURRENCY     

 select * from nls_session_parameters 顯示  

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_CURRENCY                   RMB  

 

也就是說會話字符集與終端字符集一致,而與數據庫字符集設置不一致。

另外一個數據庫實例sc

數據庫字符集

select * from nls_database_parameters 顯示

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_CURRENCY                   $   

select * from nls_instance_parameters 顯示

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA                                
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT
                                                       
NLS_CURRENCY    

 

在linux下

 select * from nls_session_parameters 顯示  

NLS_LANGUAGE                   AMERICAN                               
NLS_TERRITORY                  AMERICA    

用TOD 在windows下顯示

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_CURRENCY                   RMB  

這個我還搞不明白爲何windows與linux會話字符集爲何不同。

更搞不明白的是爲何兩個數據庫實例用同一個系統用戶查詢的,也就是說環境變量是同樣的,但查詢結果終端字符集爲何會不同?初步分析(固然不必定對,歡迎指正)是兩個數據庫實例的參數文件不一致引發的,由於alter session>環境變量>註冊表>參數文件,也就是說由於環境變量沒有設置,但sc與st數據庫實例參數文件不一樣,可是參數文件在什麼地方設還不清楚,有高手歡迎指點!


但基本上問題鎖定是由於終端字符集與數據庫字符集不一致引發,在用戶的環境變量中增長

export NLS_LANG=AMERICAN_AMERICA.UTF8
export.UTF-8
--alter database character set utf-8 

問題解決

再次查看客戶端字符集

select * from nls_instance_parameters 仍是顯示

NLS_LANGUAGE                   SIMPLIFIED CHINESE                     
NLS_TERRITORY                  CHINA                                  
NLS_SORT                                                              
NLS_DATE_LANGUAGE                                                     
NLS_DATE_FORMAT                                                       
NLS_CURRENCY     

 select * from nls_session_parameters 顯示  

NLS_LANGUAGE        AMERICAN

NLS_TERRITORY         AMERICA

NLS_CURRENCY         $

看來只要本次會話字符集正確就沒問題了,通過驗證確實如此,用

alter session set NLS_LANGUAGE=‘AMERICAN’後本次會話也不會出現亂碼的。

NSL_LANG包括三個部分(語言_地區.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET
例如能夠在cmd中鍵入
set nls_lang="Simplified chinese_china.utf8"
set nls_lang="american_america.us7ascii"
set nls_lang="american_america.zhs16gbk"
set nls_lang="Simplified chinese_china.zhs16gbk"
set nls_lang=".utf8"
set nls_lang=".zhs16gbk"
set nls_lang=".us7ascii"

unix下相似, 不過nls_lang要大寫NLS_LANG, 在.profile或這.bash_profile(根據你用的shell)裏更改NLS_LANG能夠長久保持環境變量值.

三、終端字符集

    若是數據庫字符集和sqlplus的字符集一致, 仍是不能正確顯示了, 那極可能就是你的終端應用程序的字符集不支持了. 例如你用bash登錄sqlplus, 若是你的bash是個小字符集, 那麼就不能正常顯示了.linux修改bash的字符集, 能夠先鍵入locale, 看有哪些環境變量, 再用export設置. 

4.EXP/IMP  字符集4.1 EXP/IMP    Export 和 Import 是一對讀寫Oracle數據的工具。Export 將 Oracle 數據庫中的數據輸出到操做系統文件中, Import 把這些文件中的數據讀到Oracle 數據庫中,因爲使用exp/imp進行數據遷移時,數據從源數據庫到目標數據庫的過程當中有四個環節涉及到字符集,若是這四個環節的字符集不一致,將會發生字符集轉換。 EXP     ____________ _________________ _____________     |imp導入文件|<-|環境變量NLS_LANG|<-|數據庫字符集|      ------------   -----------------   -------------IMP      ____________ _________________ _____________     |imp導入文件|->|環境變量NLS_LANG|->|數據庫字符集|      ------------   -----------------   -------------  四個字符集是   (1)源數據庫字符集    (2)Export過程當中用戶會話字符集(經過NLS_LANG設定)   (3)Import過程當中用戶會話字符集(經過NLS_LANG設定)   (4)目標數據庫字符集   4.2導出的轉換過程    在Export過程當中,若是源數據庫字符集與Export用戶會話字符集不一致,會發生字符集轉換,並在導出文件的頭部幾個字節中存儲Export用戶會話字符集的ID號。在這個轉換過程當中可能發生數據的丟失。例:若是源數據庫使用ZHS16GBK,而Export用戶會話字符集使用US7ASCII,因爲ZHS16GBK是16位字符集,而US7ASCII是7位字符集,這個轉換過程當中,中文字符在US7ASCII中不可以找到對等的字符,因此全部中文字符都會丟失而變成「?? 」形式,這樣轉換後生成的Dmp文件已經發生了數據丟失。所以若是想正確導出源數據庫數據,則Export過程當中用戶會話字符集應等於源數據庫字符集或是源數據庫字符集的超集   43導入的轉換過程    (1)肯定導出數據庫字符集環境             經過讀取導出文件頭,能夠得到導出文件的字符集設置    (2)肯定導入session的字符集,即導入Session使用的NLS_LANG環境變量    (3)IMP讀取導出文件             讀取導出文件字符集ID,和導入進程的NLS_LANG進行比較    (4)若是導出文件字符集和導入Session字符集相同,那麼在這一步驟內就不須要轉換,             若是不一樣,就須要把數據轉換爲導入Session使用的字符集。能夠看出,導入數據到數據庫過程當中發生兩次字符集轉換    第一次:導入文件字符集與導入Session使用的字符集之間的轉換,若是這個轉換過程不能正確完成,Import向目標數據庫的導入過程也就不能完成。    第二次:導入Session字符集與數據庫字符集之間的轉換。

相關文章
相關標籤/搜索