萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> Orace查詢數據出現亂碼解決辦法

Orace查詢數據出現亂碼解決辦法

下面我來介紹關於Orace查詢數據出現亂碼問題分析與最後亂碼的解決辦法,有需要學習的朋友可參考參考。

 

問題描述:

經常有些朋友會遇到,我明明是輸入的正確中文,為什麼我在另外一台電腦上查詢卻出現亂碼啦?其實這個是數據庫在進行字符集轉換的時候出現了問題,

下面通過測試來描述具體的情況:

1.環境

Oracle 數據庫字符集:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
 
SQL> SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'NLS_CHARACTERSET';
 
PROPERTY_NAME                  PROPERTY_VALUE                                                                   DESCRIPTION
------------------------------ -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
NLS_CHARACTERSET               ZHS16GBK                                                                         Character set
 

Oracle 數據庫所在的客服端字符集:

在注冊表的:NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 如下圖:

 

Oracle 所在的操作系統的字符集:

Microsoft Windows [版本 6.1.7601]
版權所有 (c) 2009 Microsoft Corporation。保留所有權利。

C:UsersAndy>chcp
活動代碼頁: 936

表示是:中國 - 簡體中文(GB2312)

2.測試

  字符集如下:

  Oracle 數據庫字符集:ZHS16GBK

  Oracle 數據庫客戶端字符集:ZHS16GBK

  操作系統字符集:中國 - 簡體中文(GB2312)

 輸入測試數據:

SQL> INSERT INTO TAB_INDX
  2  values(1,'漢字輸入字符集測試','Chinese Input Test',sysdate);
 
1 row inserted
 
字符集不修改,進行測試數據現實:

SQL> select * from tab_indx where tid = 1;
 
       TID TNAME                                                                            TDESC                                                                            SYSDT
---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----------
         1 漢字輸入字符集測試                                                               Chinese Input Test                                                               2012/12/30
 
顯示正常,

現在我把客服端的字符集修改為:UTF8

及注冊表的:NLS_LANG=SIMPLIFIED CHINESE_CHINA.UTF8

現在字符集如下:

  Oracle 數據庫字符集:ZHS16GBK

 

  Oracle 數據庫客戶端字符集:UTF8

 

  操作系統字符集:中國 - 簡體中文(GB2312)

 

現在再查詢剛才輸入的數據:

SQL> select tname,tdesc from tab_indx;
 
TNAME                                                                            TDESC
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
姹?瀛?杈??ュ?绗???娴?璇?                                                      Chinese Input Test

發現查詢出來的數據已經不能正常現實,因為這些漢字是以ZHS16GBK編碼格式存儲的,然而你查詢出來後根據Oracle客服端的編碼(UTF8)轉換,及轉成了UTF8的編碼格式,但是操作系統是簡體中文(GB2312),所以操作系統就把UTF8編碼格式的數據,當成簡體中文(GB2312)的編碼格式數據顯示,結果就出現了亂碼,

現在我再插入一筆數據:

SQL> INSERT INTO TAB_INDX
  2   values(1,'UTF8下漢字輸入字符集測試','Chinese Input Test',sysdate);
 
1 row inserted

再查詢:

SQL> select tname,tdesc from tab_indx;
 
TNAME                                                                            TDESC
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
姹?瀛?杈??ュ?绗???娴?璇?                                                      Chinese Input Test
UTF8锛??锛?锛?锛?锛??????锛?                                                     Chinese Input Test

發現新插入的數據也出現了亂碼,但是亂碼跟剛才的值不一樣??為什麼呢?

因為輸入的漢字,是簡體中文(GB2312)的編碼格式,當Oracle數據庫按照客戶端的編碼格式傳給數據庫,Oracle數據庫發現,Oracle數據庫客戶端是UTF8的編碼格式,跟數據庫的編碼格式(ZHS16GBK)不一樣,就進行字符集轉換,UTF8-->ZHS16GBK,所以把簡體中文(GB2312)的編碼格式的數據當成UTF8,轉為ZHS16GBK的編碼格式數據,就已經出錯啦,查詢出來自然轉換回去就不行啦

(本來需要測試Oracle數據庫的字符集修改後的情況,這種情況暫時不測試)這裡我們在把Oracle客戶的字符集修改回去;

在注冊表的:NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

 

現在字符集如下:

 

  Oracle 數據庫字符集:ZHS16GBK

 

  Oracle 數據庫客戶端字符集:ZHS16GBK

 

  操作系統字符集:中國 - 簡體中文(GB2312)

 

 

再查詢:

 

 

SQL> select tname,tdesc from tab_indx;
 
TNAME                                                                            TDESC
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
漢字輸入字符集測試                                                               Chinese Input Test
UTF8?????????????                                                          Chinese Input Test


發現最開始輸入的漢字正常啦,但是第二次輸入的漢字,又變了,跟上次的亂碼不一樣????

雖然這裡沒有進行編碼格式轉換,但是上次在存數據的時候,已經是存的錯誤的編碼格式,所以顯示出來肯定不正確

其實還有好幾種情況測試,由於本地環境的限制,所以測試的其它情況,大家可以去試試,如:數據庫的字符集是UTF8,然後客服端的字符集變化,對漢字的輸入輸出有什麼影響

根據上面的測試情況和我自己的分析,現在總結如下:

1.數據庫的查詢出來的數據,是Oracle數據庫字符集,Oracle客戶端字符集,操作系統字符集共同作用的結果。

2.Oracle存數據和查詢數據都是通過Oracle數據庫的字符集和Oracle客服端的字符集進行轉換的,顯示數據又是根據操作系統的字符集來確定的。

3.為了避免出現亂碼必須要把Oracle客戶端的字符集和操作系統的字符集設置成一樣的。

copyright © 萬盛學電腦網 all rights reserved