天天看點

Oracle資料庫字元集問題解決

在國内外大中型資料庫管理系統中,把ORACLE作為資料庫管理平台的使用者比較多。ORACLE 不論是資料庫管理能力還是安全性都是無可非議的,但是,它在漢字資訊的顯示方面着實給中國使用者帶來不少麻煩,筆者多年從事ORACLE資料庫管理,經常收到周圍使用者和外地使用者反映有關ORACLE資料庫漢字顯示問題的求援信,主要現象是把漢字顯示為不可識别的亂碼,造成原來大量資訊無法使用。本文将就這一問題産生的原因和解決辦法進行一些探讨,供存在這方面問題的使用者朋友參考。   

1、原因分析   

     通過對使用者反映情況的分析,發現字元集的設定不當是影響ORACLE資料庫漢字顯示的關鍵問題。那麼字元集是怎麼一會事呢?字元集是ORACLE 為适應不同語言文字顯示而設定的。用于漢字顯示的字元集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。字元集不僅需在伺服器端存在,而且用戶端也必須有字元集注冊。伺服器端,字元集是在安裝ORACLE時指定的,字元集登記資訊存儲在ORACLE資料庫字典的V$NLS_PARAMETERS表中;用戶端,字元集分兩種情況,一種情況是sql*net 2.0以下版本,字元集是在windows的系統目錄下的oracle.ini檔案中登記的;另一種情況是sql*net 2.0以上(即32位)版本,字元集是在 windows的系統系統資料庫中登記的。要在用戶端正确顯示ORACLE 資料庫漢字資訊,首先必須使伺服器端的字元集與用戶端的字元集一緻;其次是加載到ORACLE資料庫的資料字元集必須與伺服器指定字元集一緻。是以,把使用者存在的問題歸納分類,産生漢字顯示異常的原因大緻有以下幾種:   

1. 1伺服器指定字元集與客戶字元集不同,而與加載資料字元集一緻。   

      這種情況是最常見的,隻要把用戶端的字元集設定正确即可,解決辦法見2.1。   

1. 2伺服器指定字元集與客戶字元集相同,與加載資料字元集不一緻。   

     這類問題一般發生在ORACLE版本更新或重新安裝系統時選擇了與原來伺服器端不同的字元集,而恢複加載的備份資料仍是按原字元集卸出的場合,以及加載從其它使用不同字元集的ORACLE資料庫卸出的資料的情況。這兩種情況中,不管伺服器端和用戶端字元集是否一緻都無法顯示漢字。解決辦法見2.2。   

1.3伺服器指定字元集與客戶字元集不同,與輸入資料字元集不一緻。   

     這種情況是在用戶端與伺服器端字元集不一緻時,從用戶端輸入了漢字資訊。輸入的這些資訊即便是把用戶端字元集更改正确,也無法顯示漢字。解決辦法見2.3。   

2.解決辦法   

     下面将分别對上述三種情況給出解決辦法。為了叙述友善,假設用戶端使用 WINDOWS95/98環境,并已成功地配置了TCP/IP協定,安裝了ORACLE的sql*net, sql*pluse産品。   

2.1 設定用戶端字元集與伺服器端字元集一緻   

       假設目前伺服器端使用US7ASCII字元集。   

      (1)檢視伺服器端字元集   通過用戶端或伺服器端的sql*plus登入ORACLE的一個合法使用者,執行下列SQL語句:   

SQL > select * from V$NLS_PARAMETERS   

parameter value   NLS_LANGUAGE AMERICAN   

NLS_TERRITORY AMERICA   …. ….   

NLS_CHARACTERSET US7ASCII   

NLS_SORT BINARY   NLS_NCHAR_CHARACTERSET US7ASCII   

從上述清單資訊中可看出伺服器端ORACLE資料庫的字元集為'US7ASCII'。   

(2)按照伺服器端字元集對用戶端進行配置   

        配置方法有兩種:   安裝ORACLE的用戶端軟體時指定   在安裝ORACLE的用戶端産品軟體時,選擇與ORACLE服務端一緻的字元集(本例為US7ASCII)即可。   修改注冊資訊的方法   根據ORACLE 用戶端所選sql*net 的版本分為下列兩種情況:   

     a. 用戶端為 sql*net 2.0 以下版本   

進入Windows的系統目錄,編輯oracle.ini檔案,用US7ASCII替換原字元集,重新啟動計算機,設定生效。   

b. 用戶端為 sql*net 2.0 以上版本   

在WIN98 下 運 行REGEDIT,第一步選HKEY_LOCAL_MACHINE,第二步選擇SOFTWARE, 第三步選擇 ORACLE, 第四步選擇 NLS_LANG,鍵入與伺服器端相同的字元集(本例為:AMERICAN_AMERICAN.US7ASCII)。   

2.2 強制加載資料字元集與伺服器端字元集一緻   

      假設要加載資料從原ORACLE資料庫卸出時的字元集為US7ASCII,目前ORACLE 伺服器字元集為WE8ISO8859P1。   下面提供三種解決方法:   

(1) 伺服器端重新安裝ORACLE   

在重新安裝ORACLE 時選擇與原卸出資料一緻的字元集(本例為US7ASCII)。   加載原卸出的資料。   

這種情況僅僅使用于空庫和具有同一種字元集的資料。   

(2)強行修改伺服器端ORACLE目前字元集   在用imp指令加載資料前,先在用戶端用sql*plus登入system DBA使用者,執行下列SQL語句進行目前ORACLE資料庫字元集修改:   

    SQL > create database character set US7ASCII   

* create database character set US7ASCII   

ERROR at line 1:   ORA-01031: insufficient privileges   

       你會發現語句執行過程中,出現上述錯誤提示資訊,此時不用理會,實際上ORACLE資料庫的字元集已被強行修改為US7ASCII,接着用imp指令裝載資料。等資料裝載完成以後,shutdown 資料庫,再startup 資料庫,用合法使用者登入ORACLE資料庫,在sql>指令提示符下,運作select * from V$NLS_PARAMETERS,可以看到ORACLE資料庫字元集已複原,這時再檢視有漢字字元資料的表時,漢字已能被正确顯示。   

(3)利用資料格式轉儲,避開字元集限制   這種方法主要用于加載外來ORACLE資料庫的不同字元集資料。其方法如下:   

      先将資料加載到具有相同字元集的伺服器上,然後用轉換工具卸出為foxbase 格式或access格式資料庫,再用轉換工具轉入到不同字元集的ORACLE資料庫中,這樣就避免了ORACLE字元集的困擾。目前資料庫格式轉換的工具很多,象power builder5.0以上版本提供的pipeline,Microsoft Access資料庫提供的資料導入/導出功能等。轉換方法參見有關資料說明。.   

2.3比對字元集替換漢字   

     對于1.3提到的情況,沒有很好的辦法,隻能先把用戶端與伺服器端字元集比對一緻後,根據原輸入漢字的特征碼替換漢字字元部分。