通過對(duì)用戶反映情況的分析,發(fā)現(xiàn)字符集的設(shè)置不當(dāng)是影響ORACLE數(shù)據(jù)庫(kù)漢字顯示的關(guān)鍵問題。那么字符集是怎么一會(huì)事呢?字符集是ORACLE 為適應(yīng)不同語(yǔ)言文字顯示而設(shè)定的。用于漢字顯示的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。字符集不僅需在服務(wù)器端存在,而且客戶端也必須有字符集注冊(cè)。服務(wù)器端,字符集是在安裝ORACLE時(shí)指定的,字符集登記信息存儲(chǔ)在ORACLE數(shù)據(jù)庫(kù)字典的 V$NLS_PARAMETERS表中;客戶端,字符集分兩種情況,一種情況是sql*net 2.0以下版本,字符集是在windows的系統(tǒng)目錄下的oracle.ini文件中登記的;另一種情況是sql*net 2.0以上(即32位)版本,字符集是在windows的系統(tǒng)注冊(cè)表中登記的。要在客戶端正確顯示ORACLE 數(shù)據(jù)庫(kù)漢字信息,首先必須使服務(wù)器端的字符集與客戶端的字符集一致;其次是加載到ORACLE數(shù)據(jù)庫(kù)的數(shù)據(jù)字符集必須與服務(wù)器指定字符集一致。因此,把用戶存在的問題歸納分類,產(chǎn)生漢字顯示異常的原因大致有以下幾種:
1. 1服務(wù)器指定字符集與客戶字符集不同,而與加載數(shù)據(jù)字符集一致。
這種情況是最常見的,只要把客戶端的字符集設(shè)置正確即可,解決辦法見2.1。
1. 2服務(wù)器指定字符集與客戶字符集相同,與加載數(shù)據(jù)字符集不一致。
這類問題一般發(fā)生在ORACLE版本升級(jí)或重新安裝系統(tǒng)時(shí)選擇了與原來(lái)服務(wù)器端不同的字符集,而恢復(fù)加載的備份數(shù)據(jù)仍是按原字符集卸出的場(chǎng)合,以及加載從其它使用不同字符集的ORACLE數(shù)據(jù)庫(kù)卸出的數(shù)據(jù)的情況。這兩種情況中,不管服務(wù)器端和客戶端字符集是否一致都無(wú)法顯示漢字。解決辦法見2.2。
1.3服務(wù)器指定字符集與客戶字符集不同,與輸入數(shù)據(jù)字符集不一致。
這種情況是在客戶端與服務(wù)器端字符集不一致時(shí),從客戶端輸入了漢字信息。輸入的這些信息即便是把客戶端字符集更改正確,也無(wú)法顯示漢字。解決辦法見2.3。
2.解決辦法
下面將分別對(duì)上述三種情況給出解決辦法。為了敘述方便,假設(shè)客戶端使用WINDOWS95/98環(huán)境,并已成功地配置了TCP/IP協(xié)議,安裝了ORACLE的sql*net,sql*pluse產(chǎn)品。
2.1 設(shè)置客戶端字符集與服務(wù)器端字符集一致
假設(shè)當(dāng)前服務(wù)器端使用US7ASCII字符集。
?。?)查看服務(wù)器端字符集
通過客戶端或服務(wù)器端的sql*plus登錄ORACLE的一個(gè)合法用戶,執(zhí)行下列
SQL語(yǔ)句:
SQL > select * from V$NLS_PARAMETERS
parameter value
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
…. ….
NLS_CHARACTERSET US7ASCII
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET US7ASCII
從上述列表信息中可看出服務(wù)器端ORACLE數(shù)據(jù)庫(kù)的字符集為'US7ASCII'。
?。?)按照服務(wù)器端字符集對(duì)客戶端進(jìn)行配置
配置方法有兩種:
安裝ORACLE的客戶端軟件時(shí)指定
在安裝ORACLE的客戶端產(chǎn)品軟件時(shí),選擇與ORACLE服務(wù)端一致的字符集(本例為US7ASCII)即可。 網(wǎng)管u家bitscn.net
修改注冊(cè)信息的方法
根據(jù)ORACLE 客戶端所選sql*net 的版本分為下列兩種情況:
a. 客戶端為 sql*net 2.0 以下版本
進(jìn)入Windows的系統(tǒng)目錄,編輯oracle.ini文件,用US7ASCII替換原字符
集,重新啟動(dòng)計(jì)算機(jī),設(shè)置生效。
b. 客戶端為 sql*net 2.0 以上版本
在WIN98 下 運(yùn) 行REGEDIT,第一步選HKEY_LOCAL_MACHINE,第二步選擇SOFTWARE, 第三步選擇 ORACLE, 第四步選擇 NLS_LANG, 鍵 入 與服 務(wù) 器端 相 同 的 字 符集(本例為:AMERICAN_AMERICAN.US7ASCII)。
2.2 強(qiáng)制加載數(shù)據(jù)字符集與服務(wù)器端字符集一致
假設(shè)要加載數(shù)據(jù)從原ORACLE數(shù)據(jù)庫(kù)卸出時(shí)的字符集為US7ASCII,當(dāng)前ORACLE服務(wù)器字符集為WE8ISO8859P1。
下面提供三種解決方法:
?。?) 服務(wù)器端重新安裝ORACLE 網(wǎng)管有家bitscn.net
在重新安裝ORACLE 時(shí)選擇與原卸出數(shù)據(jù)一致的字符集(本例為US7ASCII)。
加載原卸出的數(shù)據(jù)。
這種情況僅僅使用于空庫(kù)和具有同一種字符集的數(shù)據(jù)。
?。?)強(qiáng)行修改服務(wù)器端ORACLE當(dāng)前字符集
在用imp命令加載數(shù)據(jù)前,先在客戶端用sql*plus登錄system DBA用戶,執(zhí)行下列SQL語(yǔ)句進(jìn)行當(dāng)前ORACLE數(shù)據(jù)庫(kù)字符集修改:
SQL > create database character set US7ASCII
* create database character set US7ASCII
ERROR at line 1:
ORA-01031: insufficient privileges
你會(huì)發(fā)現(xiàn)語(yǔ)句執(zhí)行過程中,出現(xiàn)上述錯(cuò)誤提示信息,此時(shí)不用理會(huì),實(shí)際上ORACLE數(shù)據(jù)庫(kù)的字符集已被強(qiáng)行修改為US7ASCII,接著用imp命令裝載數(shù)據(jù)。等數(shù)據(jù)裝載完成以后,shutdown 數(shù)據(jù)庫(kù),再startup 數(shù)據(jù)庫(kù),用合法用戶登錄ORACLE數(shù)據(jù)庫(kù),在sql>命令提示符下,運(yùn)行select * from V$NLS_PARAMETERS,可以看到ORACLE數(shù)據(jù)庫(kù)字符集已復(fù)原,這時(shí)再查看有漢字字符數(shù)據(jù)的表時(shí),漢字已能被正確顯示。
?。?)利用數(shù)據(jù)格式轉(zhuǎn)儲(chǔ),避開字符集限制
這種方法主要用于加載外來(lái)ORACLE數(shù)據(jù)庫(kù)的不同字符集數(shù)據(jù)。其方法如下:
先將數(shù)據(jù)加載到具有相同字符集的服務(wù)器上,然后用轉(zhuǎn)換工具卸出為foxbase 格式或access格式數(shù)據(jù)庫(kù),再用轉(zhuǎn)換工具轉(zhuǎn)入到不同字符集的ORACLE數(shù)據(jù)庫(kù)中,這樣就避免了ORACLE字符集的困擾。目前數(shù)據(jù)庫(kù)格式轉(zhuǎn)換的工具很多,象power builder5.0以上版本提供的pipeline,Microsoft Access數(shù)據(jù)庫(kù)提供的數(shù)據(jù)導(dǎo)入/導(dǎo)出功能等。轉(zhuǎn)換方法參見有關(guān)資料說(shuō)明。.
2.3匹配字符集替換漢字
對(duì)于1.3提到的情況,沒有很好的辦法,只能先把客戶端與服務(wù)器端字符集匹配一致后,根據(jù)原輸入漢字的特征碼替換漢字字符部分。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。