轉載自:http://blog.itpub.net/519536/viewspace-615379/
在資料庫伺服器字元集為AL32UTF8,我們來思考并處理一下Windows XP環境下的Toad工具顯示字元為亂碼的問題。
1.鑒于《【字元集】“客戶終端字元集”、“NLS_LANG”環境變量以及“資料庫字元集”》http://space.itpub.net/519536/viewspace-615345提到的“Toad同學”顯示不穩定的現象,這裡給出一個處理方法。
2.先列一下上面文章中得到的幾個結論:
1)如果有可能,盡量保證用戶端編碼(Windows XP的cmd工具可以使用chcp指令來确認)、NLS_LANG參數和資料庫字元集這三個内容一緻,這樣設定,無論是從性能上,還是從防止編碼轉換上都是最佳的;
2)如果目的是支援中文,資料庫Server端的字元集應該盡量選擇ZHS16GBK或AL32UTF8字元集,這樣可以減少因不當的“轉碼”導緻的字元亂碼故障;
3)(推薦)可已将NLS_LANG參數與操作終端字元編碼一緻,這樣可以保證資料庫能正确獲得應用終端使用的編碼,這時會發生“編碼轉換”,但是,這樣就可以保證正确轉碼,可以防止錯誤的編碼存入資料庫;
4)(不推薦)也可以将NLS_LANG參數與資料庫伺服器端的編碼一緻,這樣,用戶端無論是發送到伺服器端還是從伺服器接收資料都不會“轉碼”,這樣能保證用戶端對字元的顯示效果,但是,一定要小心,這時資料庫伺服器上存放的字元編碼很可能是錯誤的。
5)PL/SQL Developer工具在AL32UTF8字元集下貌似可以保證資料效果,但是“Toad同學”貌似不太“穩定”。
3.如果您仔細探究一下,亂碼的成因很單純:“亂碼”來自于“轉碼”!
4.因為Windows XP系統的字元集是936,也就是中文字元集GBK,這個字元集在Oracle中對應的就是ZHS16GBK,鑒于上面提到的結論“2)”和結論“3)”,是以就有了這個所謂的“折中式”處理方法:将Windows XP系統資料庫中的NLS_LANG參數修改為AMERICAN_AMERICA.ZHS16GBK,以便保證與Windows XP這個操作終端的字元集一緻。這樣,在每次存取資料的時候都會發生轉碼,目的是在資料庫Server端不會存入錯誤的編碼。請參考下面的确認和修改方法。
1)Windows XP字元集确認方法:
C:\>chcp
Active code page: 936
代碼頁936就是中文字元集GBK,可以參考msdn的資料《Windows Codepage 936》
http://www.microsoft.com/globaldev/reference/dbcs/936.htm
2)Windows XP環境Oracle的NLS_LANG參數修改流程:
Windows鍵+R進入到Run對話框,輸入“regedit”進入到系統資料庫
導航:HKEY_LOCAL_MACHINE --> SOFTWARE --> ORACLE --> KEY_OraDb_home1
右側找到NLS_LANG參數,修改為AMERICAN_AMERICA.ZHS16GBK。如果沒有這個參數,請自行建立。
5.這樣修改後,還帶了了一個副作用(是“副作用”,不是“負作用”,意為另外一個好的結果):
在修改NLS_LANG為AMERICAN_AMERICA.ZHS16GBK之前,該參數為AMERICAN_AMERICA.AL32UTF8,是與資料庫Server端保持一緻的,雖然這樣設定不會發生轉碼的現象,但是在Windows的cmd環境下會出現“一些漢字”(大部分可以)漢字無法錄入的問題,現象如下:
C:\>sqlplus sec/sec@DB_AL32UTF8
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Sep 23 10:57:21 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
sec@ora10g> drop table t purge;
Table dropped.
sec@ora10g> create table t (x varchar2(10 char));
Table created.
sec@ora10g> insert into t values ('侯');
ERROR:
ORA-01756: quoted string not properly terminated
這隻是一個影響,另外一個著名的影響就是加中文comments的時候也報這樣的錯誤
sec@ora10g> comment on table t is '侯';
OK,問題現象描述清楚了,下面我們修改NLS_LANG參數為AMERICAN_AMERICA.ZHS16GBK,也就是保持和XP系統的字元集一緻。
注意:需要重新進入以下SQLPLUS環境
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Sep 23 11:05:07 2009
1 row created.
Comment created.
sec@ora10g> col DUMP(X) for a30
sec@ora10g> select x,dump(x) from t;
X DUMP(X)
-------------------- ------------------------------
侯 Typ=1 Len=3: 228,190,175
效果非常的明顯吧,dump後的結果也很清楚的表名,“侯”這個字已經被“轉碼”到AL32UTF8格式的了。
6.小結
通過這個實驗我們妥善處理了兩個實際問題,如果您沒有遇到過,恭喜您,您很幸運。
1)Toad顯示字元亂碼問題
2)Windows XP環境或Toad環境下無法插入“某些漢字”和comments的問題
secooler
09.09.23
-- The End --