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:系統的顯示編碼字元集