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數據庫提供的數據導入/導出功能等。轉換方法參見有關資料說明。