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