在國內外大中型資料庫管理系統中,把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提到的情況,沒有很好的辦法,只能先把客戶端與伺服器端字符集匹配一致後,根據原輸入漢字的特徵碼替換漢字字元部分。
影響ORACLE漢字顯示的字符集
在國內外大中型資料庫管理系統中,把oracle作為資料庫管理平台的使用者比較多。oracle 不論是資料庫管理能力還是安全性都是無可非議的,但是,它在漢字資訊的顯示方面著實給中國使用者帶來不少麻煩,筆者多年從事oracle資料庫管理,經常收到周圍使用者和外地使用者反映有關oracle資料庫漢字顯示問...
ORACLE漢字顯示的字符集問題
在國內外大中型資料庫管理系統中,把oracle作為資料庫管理平台的使用者比較多。oracle 不論是資料庫管理能力還是安全性都是無可非議的,但是,它在漢字資訊的顯示方面著實給中國使用者帶來不少麻煩,筆者多年從事oracle資料庫管理,經常收到周圍使用者和外地使用者反映有關oracle資料庫漢字顯示問...
影響ORACLE漢字顯示的字符集問題
在國內外大中型資料庫管理系統中,把oracle作為資料庫管理平台的使用者比較多。oracle 不論是資料庫管理能力還是安全性都是無可非議的,但是,它在漢字資訊的顯示方面著實給中國使用者帶來不少麻煩,筆者多年從事oracle資料庫管理,經常收到周圍使用者和外地使用者反映有關oracle資料庫漢字顯示問...