Oracle資料庫字符集問題解決方案大全

hzh_hu發表於2005-05-10
 ---- 在國內外大中型資料庫管理系統中,把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提到的情況,沒有很好的辦法,只能先把客戶端與伺服器端字符集匹 配一致後,根據原輸入漢字的特徵碼替換漢字字元部分。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/95530/viewspace-797963/,如需轉載,請註明出處,否則將追究法律責任。

相關文章