Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          改變數據庫字符集的方法

          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 命令使用方法的幫助。

          posted on 2006-02-18 12:43 Vincent.Chen 閱讀(555) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 玉溪市| 绥棱县| 阿坝县| 尉氏县| 盐池县| 临武县| 大名县| 临邑县| 利津县| 陆川县| 永兴县| 天峨县| 县级市| 牡丹江市| 七台河市| 文安县| 安泽县| 通化市| 昌邑市| 平谷区| 遵义县| 云霄县| 兴安盟| 云安县| 西华县| 图们市| 马山县| 景东| 东兰县| 杨浦区| 嘉禾县| 托里县| 永和县| 七台河市| 新蔡县| 钟祥市| 黄冈市| 南城县| 海宁市| 交口县| 库车县|