我們都知道Oracle字符集問題,可以分成三類: 即,數據庫字符集, sqlplus的字符集(客戶端字符集),以及 終端程序的字符集 (非Oracle的),以下的文章就是對Oracle字符集三種類型的主要描述。
1、數據庫字符集
數據庫字符集是所有字符問題的核心,只有數據庫本身的字符集正確了,客戶端的字符集才可能正確。這裡只的客戶端包括sqlplus以及我們自己讀數據庫的應用程序。
在定位問題時,我們需要先看看數據庫當前是什麼Oracle字符集。
1)查詢數據庫字符集
- select * from nls_database_parameters
其中 nls_language表示了顯示方式, 就是sqlplus的程序的顯示字體,有SIMPLIFIED CHINESE,American america
其中 nls_characterset是字符集設定, 常用的一些Oracle字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8
2)修改數據庫字符集
當發現數據庫字符集不正確時,如我們期望時GBK的,而數據庫當前是其他的,從而引起中文亂碼。這時我們需要修改數據庫字符集。步驟如下:
- $sqlplus /nolog
- SQL>conn / as sysdba;
若此時數據庫服務器已啟動,則先執行SHUTDOWN IMMEDIATE命令關閉數據庫服務器,然後執行以下命令:
- SQL>STARTUP MOUNT;
- SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
- SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
- SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
- SQL>ALTER DATABASE OPEN;
- SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
- SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
- SQL>SHUTDOWN IMMEDIATE;
- SQL>STARTUP
2 客戶端字符集
如果服務器端的Oracle字符集是正確的,而在客戶端下,如sqlplus仍然不能正確顯示中文,這一般是由於服務器端的字符集設定與客戶端的字符集設定不同造成的。只要將兩者修改一致就可以解決問題。
1)查詢客戶端字符集
- elect * from nls_instance_parameters
客戶端字符集環境select * from nls_instance_parameters,其來源於v$parameter,
表示客戶端的字符集的設置,可能是參數文件,環境變量或者是注冊表
- select userenv('language') from dual;
會話字符集環境 select * from nls_session_parameters,其來源於v$nls_parameters,表示會話自己的設置,可能是會話的環境變量或者是alter session完成,如果會話沒有特殊的設置,將與nls_instance_parameters一致。
客戶端的字符集要求與服務器一致,才能正確顯示數據庫的非Ascii字符。如果多個設置存在的時候,alter session>環境變量>注冊表>參數文件
字符集要求一致,但是語言設置卻可以不同,語言設置建議用英文。如Oracle字符集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。 或者.zhs16gbk。注意zhs16gbk前面那個點是必須的哦!!
2) 修改客戶端字符集
Oracle 的sqlplus會去讀取OS中環境變量下的nls_lang信息
NSL_LANG包括三個部分(語言_地區.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET
例如可以在cmd中鍵入
- set nls_lang="SimplifIEd chinese_china.utf8"
- set nls_lang="american_america.us7ascii"
- set nls_lang="american_america.zhs16gbk"
- set nls_lang="SimplifIEd chinese_china.zhs16gbk"
- set nls_lang=".utf8"
- set nls_lang=".zhs16gbk"
- set nls_lang=".us7ascii"
unix下類似, 不過nls_lang要大寫NLS_LANG, 在.profile或這.bash_profile(根據你用的shell)裡更改NLS_LANG可以長久保持環境變量值.
3、終端字符集
如果數據庫字符集和sqlplus的字符集一致, 還是不能正確顯示了, 那很可能就是你的終端應用程序的Oracle字符集不支持了. 例如你用bash登陸sqlplus, 如果你的bash是個小字符集, 那麼就不能正常顯示了.Linux修改bash的字符集, 可以先鍵入locale, 看有哪些環境變量, 再用export設置.