天天看點

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

轉載自: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 --