字元集
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的每一行都是什麼意思?
LANG="zh_CN.GB18030"
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
SQL> create table test(id number(2),name char(12));
Table created.
然後插入第一條記錄:
SQL> insert into test values(1,'張三');
1 row created.
然後查看:
SQL> select * from test;
ID NAME
---------- ------------
1 ????
中文顯示為???
在伺服器上查看資料庫伺服器字元集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
如果是從用戶端插入或者匯入資料必須將用戶端的nls_lang變數設定成與伺服器一致,這裡需將用戶端設定庫:
AMERICAN_AMERICA.ZHS16GBK
查看oracle伺服器的nls_lang變數值:
[oracle@oradb ~]$ echo $NLS_LANG
AMERICAN
修改nls_name變數值為:AMERICAN_AMERICA.ZHS16GBK
然後重新登入再做查詢:
SQL> select * from test;
ID NAME
---------- ------------
1 ????
還是問號,做插入測試:
SQL> insert into test values(2,'李四');
1 row created.
SQL> select * from test;
ID NAME
---------- ------------
1 ????
2 ????
檢查i18n檔案:
vi /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
將lang的值修改庫中文字元集,下面是網上比較全的一個i18n檔案設定:
(關鍵)
LANG="zh_CN.gb2312"
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"
修改後重新登入oracle,然後進行查詢:
SQL> select * from test;
ID NAME
---------- ------------
1 ????
2 ????
還是無法正確顯示,現在做插入測試:
SQL> insert into test values(3,'王五');
1 row created
SQL> select * from test;
SQL> select * from test;
ID NAME
---------- ------------
1 ????
2 ????
3 王五
OK,現在看到剛插入的可以正常顯示了,但是之前的還是無法顯示,之前插入的記錄由於無法進行正確的轉換,即使修
總結:
就三步:
1:資料庫編碼的字元集(查詢 :select userenv('language') from dual;
2:用戶端編碼的字元集 oracle 修改.bash_profile 檔案。(操作如上)
3:系統的顯示編碼字元集