oracle 數據庫具有國際化的支持能力, 主要通過字符集等 NLS(National Language
Support) 參數設置來實現對不同國家語言環境的支持。其中數據庫的字符集是在數據庫創建的階段, 即 create database
語句中指定的,數據庫一經建立,字符集就沒法改變了,除非重建。我們最常用的字符集設置通常為 zhs16cgb231280(國標2312字庫) 和
ZHS16GBK(方正 GBK
字庫)。GBK是在GB2312-80標準基礎上的內碼擴展規范,使用了雙字節編碼方案,其編碼范圍從8140至FEFE(剔除xx7F),共23940
個碼位,共收錄了21003個漢字,完全兼容國標GB2312-80標準(只實現了6763個漢字)。
在項目開發和維護過程中我們經常會遇見下面的情況, 使用 ZHS16CGB231280 字符集的oracle 系統中,姓名中出現的很多疑難漢字無法正常顯示(顯示為 ??)。
遇見這種情況以往最常見的處理方法是導出數據(exp), 用 ZHS16GBK
字符集重建數據庫,最后再導入(imp)數據。但這個過程對于一個大型數據庫來說很漫長和痛苦。這里給大家介紹一個比較快速簡單的方法,幾分鐘就能實現字
符集轉換。這里以 oracle9i為例(8i中的操作略有不同)。
1. 作為 oracle 用戶登錄數據庫服務器
2. 停止監聽程序
$lsnrctl stop
或
$lsnrctl stop listener名稱
3. 作為 sysdba 登錄數據庫, 并檢查目前的數據庫字符集設置
sqlplus /nolog
connect /as sysdba
select value$ from props$ where name ='NLS_CHARACTERSET';
如果上述查詢結果為 ZHS16CGB231280, 則進行如下操作:
4. 保存下列數據庫配置參數的原始設置
show parameter job_queue_processes
show parameter aq_tm_processes
5. 關閉數據庫服務,重新啟動后修改數據庫字符集, 并關閉數據庫
shutdown immediate
startup mount
alter system enable restricted session;
alter database open;
alter system set job_queue_processes = 0;
alter system set aq_tm_processes = 0;
alter database character set internal_use zhs16gbk;
shutdown immediate
6. 重新啟動數據庫服務,恢復 job_queue_processes設置
startup
alter system set job_queue_processes=原始設置;
alter system set aq_tm_processes=原始設置;
exit
7. 啟動監聽程序
$lsnrctl start
或
$lsnrctl start listener名稱
8. 修改客戶端 NLS_LANG 設置
windows 客戶端在注冊表中修改 NLS_LANG 參數:
nls_lang=”American_america.zhs16gbk”
注意,這里要指出的是, 字符集間的轉換可能會造成數據庫信息破壞,如把 ZHS16GBK 的oracle 數據庫轉換為
zhs16cgb231280, 其中的疑難漢字就會變成同樣的??, 有時甚至造成主鍵重復活違反唯一索引等問題。可能很少有人知道, Oracle
其實提供了一個應用程序 csscan, 可以用來檢測字符集轉換后數據庫的內容是否會被破壞。要使用 csscan 程序必須先以 sysdba
的身份執行 $ORACLE_HOME/rdbms/admin 目錄下的 csminst.sql。csscan help=y 可以得到關于
csscan 命令使用方法的幫助。