oracle經典亂碼問題——靠靠靠靠

renke發表於2021-09-09


         最近在做一個專案的時候,遇到了一個問題,在window 2003 系統oracle 11g資料庫進行select的時候,結果為“靠靠靠靠”,當時的運維人員對oracle不太瞭解,所以就找到了我,我檢視服務端與客戶端的字符集,發現服務端為zhs16gbk,客戶端為american_america.we8iso8858p1,當我把客戶端修改與服務端一致字符集的時候,問題解決了。

下面是我做的一個技術文件,為以後的人員學習oracle做個例項說明。

環境為:

window 2003 32系統、oracle 11g資料庫

1、連線windows 2003的oracle 11g

C:>sqlplus / as sysdba

 SQL*Plus: Release 11.2.0.1.0 Production on 星期一 5月 21 15:03:29 2012

 Copyright (c) 1982, 2010, Oracle. All rights reserved.

 連線到:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

2、檢視客戶端的字符集

SQL> select userenv('language') from dual;  

 

USERENV('LANGUAGE')  

----------------------------------------------------  

AMERICAN_AMERICA.ZHS16GBK  

3、檢視服務端的字符集

SQL> set linesize 100  

SQL> col parameter for a40  

SQL> col value for a40  

SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%%';  

 

PARAMETER                VALUE  

---------------------------------------- ----------------------------------------  

NLS_CHARACTERSET             ZHS16GBK  

NLS_NCHAR_CHARACTERSET       AL16UTF16  

可以看到客戶端與服務端的字符集都是一致的,均為ZHS16GBK。

4、建立dl_char表

SQL> create table dl_char (name varchar2(20));  

 

表已建立。  

5、插入資料

SQL> insert into dl_char values ('字符集的亂碼問題');  

 

已建立 1 行。  

6、進行select查詢

SQL> select * from dl_char;  

 

NAME  

--------------------  

字符集的亂碼問題  

可以看得,現在顯示為我剛才輸入的值

7、更改客戶端的字符集

C:>SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 

8、然後重新登入

C:>sqlplus / as sysdba  

 

SQL*Plus: Release 11.2.0.1.0 Production on Mon May 21 15:06:55 2012  

 

Copyright (c) 1982, 2010, Oracle.  All rights reserved.  

 

 

Connected to:  

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  

With the Partitioning, OLAP, Data Mining and Real Application Testing options  

9、檢視客戶端的字符集

SQL> select userenv('language') from dual;  

USERENV('LANGUAGE')  

----------------------------------------------------  

AMERICAN_AMERICA.ZHS16GBK  

可以看到客戶端的字符集已經變為AMERICAN_AMERICA.ZHS16GBK了

10、然後檢視dl_char的值

SQL> select * from dl_char;  

 

NAME  

--------------------  

靠靠靠靠  

現在就出現了我前面說的4個靠字的問題,從上面的實驗,可以看到產生4靠的原因為:客戶端與服務端的字符集不一致,所以解決這個問題的方法就是在客戶端設定與服務端一致的字符集

11、現在把客戶端的字符集改成與服務端一致的字符集

C:>SET NLS_LANG=ZHS16GBK 

12、然後登陸

C:>sqlplus / as sysdba  

 

SQL*Plus: Release 11.2.0.1.0 Production on 星期一 5月 21 15:13:11 2012  

 

Copyright (c) 1982, 2010, Oracle.  All rights reserved.  

 

 

連線到:  

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  

With the Partitioning, OLAP, Data Mining and Real Application Testing options  

13、檢視客戶端與服務端的字符集

SQL> select userenv('language') from dual;  

 

USERENV('LANGUAGE')  

----------------------------------------------------  

SIMPLIFIED CHINESE_CHINA.ZHS16GBK  

 

SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%%';  

 

PARAMETER                VALUE  

---------------------------------------- ----------------------------------------  

NLS_CHARACTERSET             ZHS16GBK  

NLS_NCHAR_CHARACTERSET       AL16UTF16  

14、現在客戶端與服務端的字符集都一致了,在檢視一下dl_char裡的內容

SQL> select * from dl_char;  

 

NAME  

--------------------  

字符集的亂碼問題  

         現在顯示為正常的、我之前輸入的值了,4個靠字也沒用在出現,所以提醒大家一下,以後在做exp/imp匯出/匯入或者客戶端查詢資料等操作的時候,一定要把客戶端的字符集與服務端的字符集設定為同一個。

©著作權歸作者所有:來自51CTO部落格作者dl528888的原創作品,如需轉載,請註明出處,否則將追究法律責任

靠靠靠靠oracle 4靠解決方法oracle應用專題


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

相關文章