閔毓
          http://www.eshoo.com.cn 歡迎來到異客中國
          posts - 49,comments - 97,trackbacks - 0
          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 2005-10-20 12:34 閔毓 閱讀(611) 評論(0)  編輯  收藏 所屬分類: 數據庫心得與體會
          主站蜘蛛池模板: 永善县| 东乌珠穆沁旗| 新龙县| 盐亭县| 潮州市| 永安市| 花莲市| 偃师市| 宝兴县| 邻水| 田林县| 荃湾区| 信阳市| 科尔| 宿松县| 普定县| 施秉县| 铜鼓县| 宜昌市| 石阡县| 泸水县| 崇仁县| 石河子市| 井研县| 望江县| 阿克苏市| 越西县| 罗田县| 中西区| 福鼎市| 壤塘县| 唐海县| 古蔺县| 稷山县| 江油市| 赫章县| 乌兰县| 故城县| 南部县| 达州市| 巴塘县|