Oracle10g更改數據庫字符集

一、軟件環境

     1)oracle 10g

二、問題描述

      Oracle數據庫中文字符出現亂碼,所以的中文字符顯示’?’符號

三、原因分析

     Oracle的字符集有互相的包容關係。如us7ascii就是zhs16gbk的子集,從us7ascii到zhs16gbk不會有數據解釋上的問題,不會有數據丟失。在所有的字符集中utf8應該是最大,因爲它基於unicode,雙字節保存字符(也因此在存儲空間上佔用更多)。
     一旦數據庫創建後,數據庫的字符集理論上講是不能改變的。因此,在設計和安裝之初考慮使用哪一種字符集十分重要。根據Oracle的官方說明,字符集的轉換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關係,那麼字符集的轉換是不受oracle支持的。對數據庫server而言,錯誤的修改字符集將會導致很多不可測的後果,可能會嚴重影響數據庫的正常運行,所以在修改之前一定要確認兩種字符集是否存在子集和超集的關係。一般來說,除非萬不得已,我們不建議修改oracle數據庫。

四、解決方案

    需要修改數據庫字符集爲'us7ascii'。
    查看數據庫當前數據集有兩種方式:
      a).select name,value$ from props$ where name like '%NLS%',其中NLS_CHARACTERSET所對應的爲當前數據庫的字符集;
      b).select userenv('language') from dual;

    1.常規方案修改數據庫字符集

      1).以管理員身份登錄:conn  sys/xxx  as sysdba,或者conn  /  as sysdba;
      2).關閉數據庫:shutdown immediate;
      3).以mount方式開啓數據庫:startup mount
      4).限制其它用戶連接數據庫使用資源: alter system enable restricted session;
      5).查看系統當前的進程(最大連接數):show parameter processes;
      6).設置job_queue_processes=0殺掉CJQ0及相應job進程: alter system set job_queue_processes=0;
      7).修改參數alter system set aq_tm_processes=0;
      8).更改數據庫爲open方式:alter database open;
      9).更改字符集:alter database character set us7ascii;
      a).*在這裏,如果當前數據庫的字符集是系統字符集us7asci的超集,更改不會出問題;如果不是,將會提示:
     ORA-12712: 新字符集必須爲舊字符集的超集
     
b).*如果數據庫數據有CLOB類型,系統將會提示:
     ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists

    2.使用INTERNAL_USE跳過超集檢測

    針對以上的錯誤a)的解決方案:
      
10).ALTER DATABASE character set INTERNAL_USE us7ascii;--跳過超集檢查

    3.使用internal_convert轉換含有CLOB字段的表

   針對以上的錯誤b)的解決方案:
  10).截斷表truncate table Metastylesheet;
  11).alter database character set internal_convert zhs16gbk;-- ORACLE會自動轉換含有CLOB
  12).因爲前面清空了SYS.METASTYLESHEET表,需要重新創建
       9.2通過@?/rdbms/admin/catmet.sql創建;
          10g中沒有catmet.sql這個腳本,通過運行catmeta.sql腳本來重建
          @?/rdbms/admin/catmeta.sql
          (注意這個地方有待商榷,不確定,最好不要使用這種方法修改)

    4.完成方案a)和b)後再做如下步驟:

  1).查看當前字符集,確認是否正確修改;
  2).解除限制其它用戶連接數據庫使用資源: alter system disable restricted session;
  3).最好也也設置一下set NLS_LANG
  4).關閉數據庫再打開;

 

*以上內容通過參考整理而來,已經通過實踐驗證!

不求十全十美,但求問心無愧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章