【字符集】處理Toad顯示亂碼及Windows XP下無法插入“某些漢字”問題

bluelight發表於2011-09-01

在資料庫伺服器字符集為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 --&gt SOFTWARE --&gt ORACLE --&gt KEY_OraDb_home1
右側找到NLS_LANG引數,修改為AMERICAN_AMERICA.ZHS16GBK。如果沒有這個引數,請自行建立。

5.這樣修改後,還帶了了一個副作用(是“副作用”,不是“負作用”,意為另外一個好的結果):
在修改NLS_LANG為AMERICAN_AMERICA.ZHS16GBK之前,該引數為AMERICAN_AMERICA.AL32UTF8,是與資料庫Server端保持一致的,雖然這樣設定不會發生轉碼的現象,但是在Windows的cmd環境下會出現“一些漢字”(大部分可以)漢字無法錄入的問題,現象如下:
C:>sqlplus

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

> drop table t purge;

Table dropped.

> create table t (x varchar2(10 char));

Table created.

> insert into t values ('侯');
ERROR:
ORA-01756: quoted string not properly terminated

這只是一個影響,另外一個著名的影響就是加中文comments的時候也報這樣的錯誤
> comment on table t is '侯';
ERROR:
ORA-01756: quoted string not properly terminated

OK,問題現象描述清楚了,下面我們修改NLS_LANG引數為AMERICAN_AMERICA.ZHS16GBK,也就是保持和XP系統的字符集一致。
注意:需要重新進入以下SQLPLUS環境
C:>sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Sep 23 11:05:07 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

> insert into t values ('侯');

1 row created.

> comment on table t is '侯';

Comment created.

> col DUMP(X) for a30
> 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的問題

Good luck.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1724534/viewspace-1054674/,如需轉載,請註明出處,否則將追究法律責任。

相關文章