天天看點

Linux下oracle插入(導入)中文記錄顯示為問号問題及解決辦法

Blog Transferred to: http://www.kanhua.org

字元集

oracle官方關于字元集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm

       首先要明确什麼是字元集?字元集是一個位元組資料的解釋的符号集合,有大小之分,有互相的包括關系,如us7ascii就是zhs16gbk的子集,從us7ascii到zhs16gbk不會有資料解釋上的問題,不會有資料丢失,Oracle對這種問題也要求從子集到超集的導出受支援,反之不行。在所有的字元集中utf8應該是最大,因為它基于unicode,雙位元組儲存字元(也是以在存儲空間上占用更多),。

    其次,一旦資料庫建立後,資料庫的字元集是不能改變的。是以,在設計和安裝之初考慮使用哪一種字元集是十分重要的。資料庫字元集應該是作業系統本地字元集的一個超集。存取資料庫的客戶使用的字元集将決定選擇哪一個超集,即資料庫字元集應該是所有客戶字元集的超集。

nls_lang變量:

Windows下:在系統的環境變量裡和系統資料庫裡可以找到進行設定

Linux下:在oracle使用者下的.bash_profile檔案裡進行設定

NLS_LANG格式:

NLS_LANG = language_territory.charset

有三個組成部分(語言、地域和字元集),每個成分控制了NLS子集的特性。其中:language 指定伺服器消息的語言。

territory 指定伺服器的日期和數字格式。

charset 指定字元集

例如:

AMERICAN _ AMERICA. ZHS16GBK

linux系統語言:

/etc/sysconfig/i18n

在Red hat下面/etc/sysconfig/i18n的每一行都是什麼意思?







SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"



SYSFONT="latarcyrheb-sun16" 


      
/etc/sysconfig/i18n 這裡存放的是系統的區域語言設定, i18n是 國際化internationalization的縮寫 i和n之間正好18個字母 



第一行 表明你目前系統的語言環境變量設定 ,這裡是 zh_CN.GB18030



第二行 表明系統預置了那些語言支援 ,不在項目中的語言不能正常顯示



第三行 定義控制台終端字型,你文本登入的時候顯示的字型就是這個 latarcyrheb-sun16 


      
在導入導出oracle資料時,必須将用戶端和oracle伺服器的字元集設定成一緻,否則導入資料庫的中文字元很可能是亂碼而無法正确顯示,然後設定正确的環境變量,然後還要設定作業系統的語言設定,即設定i18n,下面是在伺服器上我實驗例子:


      
建立表test


      
        ID NAME



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



         1 ????
      
USERENV('LANGUAGE')



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



AMERICAN_AMERICA.ZHS16GBK




如果是從用戶端插入或者導入資料必須将用戶端的nls_lang變量設定成與伺服器一緻,這裡需将用戶端設定庫:
      
AMERICAN_AMERICA.ZHS16GBK

      
[[email protected] ~]$ echo $NLS_LANG



AMERICAN
      
修改nls_name變量值為:AMERICAN_AMERICA.ZHS16GBK

      
        ID NAME



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



         1 ????
      
        ID NAME



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



         1 ????



         2 ????
      
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"



SYSFONT="latarcyrheb-sun16"
      
将lang的值修改庫中文字元集,下面是網上比較全的一個i18n檔案設定:

(關鍵)

      
SUPPORTED="zh_CN.GB18030:zh_CN:zh:zh_CN.GB2312:zh_CN:zh:zh_CN.gbk:zh_CN:zh:zh_HK.UTF-8:zh_HK:zh:zh_CN.UTF-8:zh_CN:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en"



SYSFONT="latarcyrheb-sun16"

      
        ID NAME



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



         1 ????



         2 ????
      
還是無法正确顯示,現在做插入測試:

SQL> insert into test values(3,'王五');
      

1 row created

        ID NAME



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



         1 ????



         2 ????



         3 王五
      
OK,現在看到剛插入的可以正常顯示了,但是之前的還是無法顯示,之前插入的記錄由于無法進行正确的轉換,即使修

總結:

  就三步:

  1:資料庫編碼的字元集(查詢 :select userenv('language') from dual;

2:用戶端編碼的字元集   oracle  修改.bash_profile 檔案。(操作如上) 

3:系統的顯示編碼字元集