在國內外大中型資料庫管理系統中,把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全球支援 即globalization support 允許我們使用本地語言和格式來儲存和檢索資料。通過全球支援,oracle可以支援多種語言及字符集,得以展示資料庫的強大魅力。1 字符集的基本知識 如果從頭說起,字符集最早的編碼方案來自於與ascii.這也是我們最常見的編碼方式。該方案...
oracle資料庫字符集
一 什麼是oracle字符集 oracle字符集是乙個位元組資料的解釋的符號集合,有大小之分,有相互的包容關係。oracle 支援國家語言的體系結構允許你使用本地化語言來儲存,處理,檢索資料。它使資料庫工具,錯誤訊息,排序次序,日期,時間,貨幣,數字,和日曆自動適應本地化語言和平台。影響oracle...