天天看點

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