引言
ORACLE數據庫作為業界領先的數據庫產品近年來在國內大中型企業中得到了廣泛的應用雖然ORACLE數據庫產品本身在本地化方面已做得相當成熟但還是有不少用戶反應漢字顯示亂碼的問題如對同一數據庫不同的用戶對同一表中的username查詢卻得出了不同的結果
“ORACLE??????”和“ORACLE中國有限公司”顯然結果中將中文字符顯示為亂碼那麼為什麼呢?字符集的設置不當是影響ORACLE數據庫漢字顯示的關鍵問題
關於字符集
字符集是ORACLE為適應不同語言文字顯示而設定的用於漢字顯示的字符集主要有ZHSCGBZHSGBKUSASCII和UTF等字符集同時存在於服務器端和客戶端服務器端字符集是在安裝ORACLE時指定的字符集登記信息存儲在ORACLE數據庫字典的V$NLS_PARAMETERS表中;而客戶端字符集是在系統注冊表(WINDOWS系統)或在用戶的環境變量(UNIX系統)中設定的
字符集的構成與設定
字符集的構成與設定方式分為客戶端與服務器端兩種
()客戶端字符集的構成與設定客戶端的字符集是由當前用戶的環境變量NLS_LANG設定的環境變量NLS_LANG的構成
NLS_LANG=language_territorycharset
其中
language 指定服務器消息的語言
territory 指定服務器的日期和數字格式
charset 指定字符集
三個成分可以任意組合例如
AMERICAN_AMERICAUSSCII
SIMPLIFIED CHINESE_CHINAZHSGBK
AMERICAN_AMERICA ZHSGBK
客戶端字符集的設定方法針對不同操作系統設定方法稍有不同WINDOWS系統是在注冊表項HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\NLS_LANG中設定;UNIX系統是在當前用戶的環境變量中設定如在當前用戶的profile文件中增加一行如下代碼
NLS_LANG=SIMPLIFIED Chinese_CHINAZHSGBK;export NLS_LANG
()服務端字符集的構成與設定服務端字符集的構成體現在數據字典表V$NLS_PARAMETERS的NLS_LANGUAGENLS_TERRITORYNLS_CHARACTERSET三項取值上其中NLS_CHARACTERSET的取值就是具體的數據庫字符集
如利用查詢語句SQL>SELECT * FROM V$NLS_PARAMETERS;
可得到如下結果
PARAMETER VALUE
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
……
NLS_CHARACTERSET ZHSGBK
……
即當前數據庫使用的字符集是ZHSGBK
數據庫服務端的字符集是在創建數據時設定的但可通過如下方法對已設定的字符集進行修改
方法一重建數據庫建立數據庫時將數據庫的字符集設定為所需字符集
方法二修改SYSPROPS$表即用SYS用戶登陸ORACLE後利用下面語句修改相應的字符集並提交
SQL>UPDATE PROPS$ SET VALUE$=’ZHSGBK‘
WHERE NAME=’NLS_CHARACTERSET’;
SQL>COMMIT;
通過此種方法來更改數據庫字符集只對更改後的數據有效即數據庫中原來的數據仍以原字符集被存儲
另外有的還利用CREATE DATABASE CHARACTER SET ZHSGBK命令暫時的修改字符集當重啟數據庫後數據庫字符集將恢復原來的字符集
常見的漢字亂碼問題及解決方案
要在客戶端正確顯示ORACLE數據庫中的漢字信息首先必須使客戶端的字符集與服務器端的字符集一致;其次是加載到ORACLE數據庫的數據字符集必須與服務器字符集一致據此漢字顯示亂碼的問題大致可以分為以下幾種情況
()客戶端字符集與服務器端字符集不同服務器端字符集與加載數據字符集一致這種情況是最常見的只要把客戶端的字符集設置正確即可具體解決方案
第一步查詢V$NLS_PARAMETERS得到服務端的字符集
SQL>SELECT * FROM V$NLS_PARAMETERS;
第二步根據服務端的字符集設定客戶端的字符集設定方法參見客戶端的字符集的設定方式
以UNIX系統為例可在當前用戶的profile文件中增加如下兩行
NLS_LANG=SIMPLIFIED Chinese_CHINAZHSGBK
export NLS_LANG
()客戶端字符集與服務器端字符集相同服務器端字符集與加載數據字符集不一致這種情況一般發生在ORACLE版本升級或重新安裝數據庫時選擇了與原來數據庫不同的字符集而恢復加載的備份數據仍是按原字符集卸出的場合另一種情況是加載從其它使用不同字符集的ORACLE數據庫卸出的數據在這兩種情況中不管客戶端字符集與服務器端字符集是否一致都無法正確顯示漢字具體解決方案
方案一按服務端字符集的修改方法修改服務端字符集與加載數據字符集一致然後導入數據
方案二利用數據格式轉儲避開字符集帶來的問題即先將加載數據倒入到與其字符集一致的數據庫中然後再將數據要麼按文本格式導出(數據量較小的情況下)要麼通過第三方工具(如POWER BUILDERACCESSFOXPRO等)倒出數據最後將倒出的數據導入到目標數據庫中
()客戶端字符集與服務器端字符集不同服務端字符集與輸入數據字符集不同這種情況是在客戶端字符集與服務器端字符集不一致時從客戶端輸入了漢字信息輸入的這些信息即便是把客戶端字符集更改正確也無法顯示漢字解決方案修改客戶端字符集與服務端字符集一致後重新輸入數據
其中:
sqlplus亂碼解決
export NLS_LANG=AMERICAN_AMERICAZHSGBK (顯示英文)
或
export NLS_LANG="SIMPLIFIED CHINESE"_CHINAzhscgb
(顯示簡體中文)
結束語
根據ORACLE官方文檔的說明一旦數據庫創建後數據庫的字符集是不能改變的因此提前考慮自己的數據庫將選用哪一種字符集是十分重要的數據庫字符集選擇的一般規則是將數據庫字符集設定為操作系統本地字符集的一個超集同時數據庫字符集也應該是所有客戶字符集的超集如同樣是中文環境在選擇ZHSCGB還是ZHSGBK時我們更多的情況是選擇ZHSGBK因為它包含了ZHSCGB字符集
From:http://tw.wingwit.com/Article/program/Oracle/201311/19051.html