Oracle 8i字符集亂碼問題析及其解決辦法
更新時間:2007年03月07日 00:00:00 作者:
正在看的ORACLE教程是:Oracle 8i字符集亂碼問題析及其解決辦法。一、問題描述
SQL Plus WorkSheet是一個窗口圖形界面的SQL語句編輯器,對于那些喜歡窗口界面而不喜歡字符界面的用戶,該工具相對SQL/PLUS受到了很大的歡迎。但從Oracle 8i以后,如果安裝Oracle 8i時選取的是別于英語的字符集,對于我們中國,通常會選取簡體中文字符集(ZHS16GBK),安裝成功后,運行SQL Plus WorkSheet程序,會出現(xiàn)所有的中文顯示以及查詢結(jié)果均為亂碼的情況。
二、問題分析
最初出現(xiàn)該問題,首先懷疑就是安裝時字符集設置有問題,也就是說沒有設置正確的簡體中文字符集。首先檢查數(shù)據(jù)庫字符集,在SQL/PLUS中,運行下面的SQL語句,檢查所連接數(shù)據(jù)庫的字符集:
查詢結(jié)果發(fā)現(xiàn)數(shù)據(jù)庫安裝時所選字符集為簡體中文ZHS16GBK,說明安裝時字符集設置完全正確。第二步開始懷疑是用戶客戶端字符集問題,檢查客戶端注冊表,打開注冊表編輯程序(RegEdit),在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG,發(fā)現(xiàn)Oracle客戶端字符集為AMERICAN_AMERICA.ZHS16GBK,設置也完全正確,可以排除是客戶端字符集設置錯誤的問題。同時還有一個現(xiàn)象就是在同一個客戶端機器上SQL/PLUS中的查詢字符集顯示完全正常,這也說明不是字符集設置問題,而是系統(tǒng)程序SQL/Plus Worksheet的問題。
在Oracle 8i以前的版本中,從來沒有出現(xiàn)過這樣的情況,這應該和Oracle版本有關,我們知道Oracle 8i和它前面的版本一個顯著的區(qū)別就是大部分的Oracle系統(tǒng)程序,現(xiàn)在均采用Java驅(qū)動,其實這也就是產(chǎn)生字符集亂碼問題的根本所在。非Java驅(qū)動的程序,如SQL*Plus,有一個系統(tǒng)參數(shù)NLS_LANG,該參數(shù)在UNIX系統(tǒng)中設置在環(huán)境變量中,在Windows操作系統(tǒng)中設置在注冊表中,這個參數(shù)決定了客戶端應用程序的字符集。而對于基于Java應用的程序,如現(xiàn)在遇到的SQL*PLus Worksheet,NLS_LANG參數(shù)對這類程序是不起任何作用的。
三、解決方案
找到了問題產(chǎn)生的原因后,下面來討論如何解決該問題。對于Oracle Enterprise Manager中的所有工具,有一個配置文件名為dbappscfg.properties,修改該文件即可解決上述問題。這個文件的位置在$ORACLE_HOME\sysman\config目錄下,用任何的文本編輯器打開該文件,在這個文件里面,找到這樣一項,
去掉注釋符#,同時將其修改為SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
對于Windows操作系統(tǒng),還需要修改一項,在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉注釋符,將其修改為你所在機器的操作系統(tǒng)主目錄。如操作系統(tǒng)的主目錄在D盤的Winnt下,則將其修改為 SQLPLUS_SYSTEMROOT=d:\\WINNT。
對于后面一項的修改只對Windows操作系統(tǒng)進行,對UNIX操作系統(tǒng)則不需要。如果在Windows操作系統(tǒng)中不修改該項,在Oracle Enterprise Manager中,連接系統(tǒng)時,會提示如下的錯誤:
或者
修改完成后,保存文件,退出編輯。重新連接SQL PLUS Worksheet,字符集亂碼問題得到解決,顯示正確的簡體中文字符集。
SQL Plus WorkSheet是一個窗口圖形界面的SQL語句編輯器,對于那些喜歡窗口界面而不喜歡字符界面的用戶,該工具相對SQL/PLUS受到了很大的歡迎。但從Oracle 8i以后,如果安裝Oracle 8i時選取的是別于英語的字符集,對于我們中國,通常會選取簡體中文字符集(ZHS16GBK),安裝成功后,運行SQL Plus WorkSheet程序,會出現(xiàn)所有的中文顯示以及查詢結(jié)果均為亂碼的情況。
二、問題分析
最初出現(xiàn)該問題,首先懷疑就是安裝時字符集設置有問題,也就是說沒有設置正確的簡體中文字符集。首先檢查數(shù)據(jù)庫字符集,在SQL/PLUS中,運行下面的SQL語句,檢查所連接數(shù)據(jù)庫的字符集:
查詢結(jié)果發(fā)現(xiàn)數(shù)據(jù)庫安裝時所選字符集為簡體中文ZHS16GBK,說明安裝時字符集設置完全正確。第二步開始懷疑是用戶客戶端字符集問題,檢查客戶端注冊表,打開注冊表編輯程序(RegEdit),在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG,發(fā)現(xiàn)Oracle客戶端字符集為AMERICAN_AMERICA.ZHS16GBK,設置也完全正確,可以排除是客戶端字符集設置錯誤的問題。同時還有一個現(xiàn)象就是在同一個客戶端機器上SQL/PLUS中的查詢字符集顯示完全正常,這也說明不是字符集設置問題,而是系統(tǒng)程序SQL/Plus Worksheet的問題。
在Oracle 8i以前的版本中,從來沒有出現(xiàn)過這樣的情況,這應該和Oracle版本有關,我們知道Oracle 8i和它前面的版本一個顯著的區(qū)別就是大部分的Oracle系統(tǒng)程序,現(xiàn)在均采用Java驅(qū)動,其實這也就是產(chǎn)生字符集亂碼問題的根本所在。非Java驅(qū)動的程序,如SQL*Plus,有一個系統(tǒng)參數(shù)NLS_LANG,該參數(shù)在UNIX系統(tǒng)中設置在環(huán)境變量中,在Windows操作系統(tǒng)中設置在注冊表中,這個參數(shù)決定了客戶端應用程序的字符集。而對于基于Java應用的程序,如現(xiàn)在遇到的SQL*PLus Worksheet,NLS_LANG參數(shù)對這類程序是不起任何作用的。
三、解決方案
找到了問題產(chǎn)生的原因后,下面來討論如何解決該問題。對于Oracle Enterprise Manager中的所有工具,有一個配置文件名為dbappscfg.properties,修改該文件即可解決上述問題。這個文件的位置在$ORACLE_HOME\sysman\config目錄下,用任何的文本編輯器打開該文件,在這個文件里面,找到這樣一項,
去掉注釋符#,同時將其修改為SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
對于Windows操作系統(tǒng),還需要修改一項,在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉注釋符,將其修改為你所在機器的操作系統(tǒng)主目錄。如操作系統(tǒng)的主目錄在D盤的Winnt下,則將其修改為 SQLPLUS_SYSTEMROOT=d:\\WINNT。
對于后面一項的修改只對Windows操作系統(tǒng)進行,對UNIX操作系統(tǒng)則不需要。如果在Windows操作系統(tǒng)中不修改該項,在Oracle Enterprise Manager中,連接系統(tǒng)時,會提示如下的錯誤:
或者
修改完成后,保存文件,退出編輯。重新連接SQL PLUS Worksheet,字符集亂碼問題得到解決,顯示正確的簡體中文字符集。
相關文章
Oracle數(shù)據(jù)倉庫的分層管理器解決方案開發(fā)者網(wǎng)絡Oracle
Oracle數(shù)據(jù)倉庫的分層管理器解決方案開發(fā)者網(wǎng)絡Oracle...2007-03-03
Oracle數(shù)據(jù)庫中文顯示???????解決辦法
這兩天剛剛使用Oracle,出現(xiàn)了好多不愉快的事情,下面分享一下我的一點經(jīng)歷,這篇文章主要給大家介紹了關于Oracle數(shù)據(jù)庫中文顯示???????的解決辦法,需要的朋友可以參考下2024-04-04
oracle中使用group by優(yōu)化distinct
這篇文章主要介紹了oracle中使用group by優(yōu)化distinct的相關資料,需要的朋友可以參考下2015-11-11
Oracle查詢中OVER (PARTITION BY ..)用法
這篇文章主要介紹了Oracle查詢中OVER (PARTITION BY ..)用法,內(nèi)容和代碼大家參考一下。2017-11-11
關于Oracle存儲過程和調(diào)度器實現(xiàn)自動對數(shù)據(jù)庫過期數(shù)據(jù)清除的問題
這篇文章主要介紹了Oracle存儲過程和調(diào)度器實現(xiàn)自動對數(shù)據(jù)庫過期數(shù)據(jù)清除,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
解決Oracle數(shù)據(jù)庫歸檔日志占滿磁盤空間問題
這篇文章主要介紹了解決Oracle數(shù)據(jù)庫歸檔日志占滿磁盤空間問題,文中給大家提到了常用命令及實現(xiàn)代碼,需要的朋友可以參考下2018-08-08
oracle數(shù)據(jù)庫id自增及生成uuid問題
這篇文章主要介紹了oracle數(shù)據(jù)庫id自增及生成uuid問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05

