一、問題描述
SQL Plus WorkSheet是一個窗口圖形界面的SQL語句編輯器,對於那些喜歡窗口界面而不喜歡字符界面的用戶,該工具相對SQL/PLUS受到了很大的歡迎。但從Oracle 8i以後,如果安裝Oracle 8i時選取的是別於英語的字符集,對於我們中國,通常會選取簡體中文字符集(ZHS16GBK),安裝成功後,運行SQL Plus WorkSheet程序,會出現所有的中文顯示以及查詢結果均為亂碼的情況。
二、問題分析
最初出現該問題,首先懷疑就是安裝時字符集設置有問題,也就是說沒有設置正確的簡體中文字符集。首先檢查數據庫字符集,在SQL/PLUS中,運行下面的SQL語句,檢查所連接數據庫的字符集:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
查詢結果發現數據庫安裝時所選字符集為簡體中文ZHS16GBK,說明安裝時字符集設置完全正確。第二步開始懷疑是用戶客戶端字符集問題,檢查客戶端注冊表,打開注冊表編輯程序(RegEdit),在HKEY_LOCAL_MacHINE/SOFTWARE/ORACLE/NLS_LANG,發現Oracle客戶端字符集為AMERICAN_AMERICA.ZHS16GBK,設置也完全正確,可以排除是客戶端字符集設置錯誤的問題。同時還有一個現象就是在同一個客戶端機器上SQL/PLUS中的查詢字符集顯示完全正常,這也說明不是字符集設置問題,而是系統程序SQL/Plus Worksheet的問題。
在Oracle 8i以前的版本中,從來沒有出現過這樣的情況,這應該和Oracle版本有關,我們知道Oracle 8i和它前面的版本一個顯著的區別就是大部分的Oracle系統程序,現在均采用Java驅動,其實這也就是產生字符集亂碼問題的根本所在。非Java驅動的程序,如SQL*Plus,有一個系統參數NLS_LANG,該參數在UNIX系統中設置在環境變量中,在Windows操作系統中設置在注冊表中,這個參數決定了客戶端應用程序的字符集。而對於基於