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 閱讀(554) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 宽甸| 交城县| 溆浦县| 寿阳县| 西青区| 罗定市| 云林县| 宜城市| 肃北| 望城县| 永昌县| 铜鼓县| 武定县| 青浦区| 长春市| 潍坊市| 阳江市| 巫山县| 清镇市| 会泽县| 平乐县| 万载县| 二连浩特市| 德保县| 新密市| 灵寿县| 合作市| 六盘水市| 奉新县| 卢龙县| 菏泽市| 达尔| 英德市| 攀枝花市| 晋宁县| 新营市| 和林格尔县| 汝南县| 牙克石市| 诸城市| 东台市|