程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 影響Oracle漢字顯示的字符集問題

影響Oracle漢字顯示的字符集問題

編輯: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 提到的情況,沒有很好的辦法,只能先把客戶端與服務器端字符集匹配一致後,根據原輸入漢字的特征碼替換漢字字符部分。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved