【背景介紹】
===================================================================
最近在使用Oracle9i數(shù)據(jù)庫進(jìn)行數(shù)據(jù)插入、查詢、導(dǎo)入/出,有時(shí)會(huì)出現(xiàn)亂碼的情況,具體的情形有以下兩種:
1.首次插入/顯示亂碼
2.首次插入/顯示正常、但把數(shù)據(jù)用工具導(dǎo)出為本地文件(例如TXT)文件,再在另一個(gè)客戶端中打開該文件并執(zhí)行時(shí)再次插入的數(shù)據(jù)顯示為亂碼。
遂在本地創(chuàng)建兩個(gè)數(shù)據(jù)庫,一個(gè)為AL32UTF8字符集,一個(gè)為ZHS16GBK字符集,配合客戶端NLS_LANG的不同設(shè)置,測試亂碼的情況及進(jìn)行原因分析。
===================================================================
【測試目的】
===================================================================
測試不同的數(shù)據(jù)庫字符集和客戶端NLS_LANG搭配下,中文字符/中文日期的插入、顯示
===================================================================
【測試環(huán)境】
===================================================================
Windows 2000 Professional (英文版) + Oracle 9.2.0.1.0 + SQL*Plus: Release 9.2.0.1.0
注:此次測試的客戶端應(yīng)用工具為SQL*PLUS,如果是使用TOAD、PL/SQL Develop之類工具,得到的結(jié)果會(huì)和以下有些不同。推薦使用SQL*PLUS作為一切客戶端應(yīng)用的測試工具
===================================================================
【測試數(shù)據(jù)庫】
===================================================================
本機(jī)數(shù)據(jù)庫1: SID: PAULLIN 登陸參數(shù): qprod/qprod@paullin
本機(jī)數(shù)據(jù)庫2:SID: PAUL 登陸參數(shù):qlinpen/pengpenglin@paul
===================================================================
【測試字符集】
===================================================================
客戶端應(yīng)用/操作系統(tǒng)字符集:GB2312
客戶端NLS_LANG設(shè)置:
AMERICAN_AMERICA.US7ASCII
AMERICAN_AMERICA.WE8MSWIN1252
AMERICAN_AMERICA.ZHS16GBK
AMERICAN_AMERICA.AL32UTF8
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
數(shù)據(jù)庫端字符集:
PAULLIN: AL32UF8
PAUL: ZHS16GBK
===================================================================
【測試腳本】
===================================================================
--登陸數(shù)據(jù)庫
sqlplus qprod/qprod@paullin
sqlplus qlinpen/pengpenglin@paul
--執(zhí)行測試腳本
drop table test;
drop table testdate;
create table test (id number(1), name varchar2(20));
create table testdate (birthday date);
insert into test values(1,'Tom');
insert into test values(2,'張三');
insert into test values(3,'易建聯(lián)');
commit;
insert into testdate values(TO_Date( '01/08/2008 04:14:00 下午',
'MM/DD/YYYY HH:MI:SS AM'));
commit;
--查看測試結(jié)果
select * from test;
select * from testdate;
===================================================================
【測試一:數(shù)據(jù)庫端字符集為AL32UTF8的情況】
===================================================================
1.登陸數(shù)據(jù)庫:
C:\Documents and Settings\qlinpen.E0015609D6309>sqlplus qprod/qprod@paullin
2.查看數(shù)據(jù)庫字符集:
SQL> select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
3.測試內(nèi)容及測試結(jié)果:
1).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.US7ASCII:
中文字符測試:插入/顯示中文字符均為亂碼
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
2).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.WE8MSWIN1252:
中文字符測試:插入/顯示中文字符均為正常
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
3).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.ZHS16GBK:
中文字符測試:插入/顯示中文字符均為正常
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
4).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.AL32UTF8:
中文字符測試:插入/顯示中文字符均為正常
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
5).客戶端NLS_LANG設(shè)置為SIMPLIFIED CHINESE_CHINA.ZHS16GBK:
中文字符測試:插入/顯示中文均為正常
中文日期測試:插入/顯示中文日期均為正常,格式為DD-MM-YY(例如:08-1月 -08)
4.測試結(jié)論:
從測試結(jié)果來看,當(dāng)數(shù)據(jù)庫端字符集為AL32UTF8時(shí),能夠使到中文字符被正確插入/顯示的NLS_LANG的字符集為: WE8MSWIN1252、ZHS16GBK、AL32UTF8。
但是要使到中文格式的時(shí)間能夠被正確插入,則NLS_LANG的LANGUAGE和TERRITORY設(shè)置必須為:SIMPLIFIED_CHINESE_CHINA
===================================================================
【測試二:數(shù)據(jù)庫端字符集為ZHS16GBK的情況】
===================================================================
1.登陸數(shù)據(jù)庫:
C:\Documents and Settings\qlinpen.E0015609D6309>sqlplus qlinpen/pengpenglin@paul
2.查看數(shù)據(jù)庫字符集:
SQL> select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
3.測試內(nèi)容及測試結(jié)果:
1).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.US7ASCII:
中文字符測試:插入/顯示中文字符均為亂碼
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
2).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.WE8MSWIN1252:
中文字符測試:插入/顯示中文字符均為亂碼
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
3).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.ZHS16GBK:
中文字符測試:插入/顯示中文字符均為正常
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
4).客戶端NLS_LANG設(shè)置為AMERICAN_AMERICA.AL32UTF8:
中文字符測試:插入/顯示中文字符均為亂碼
中文日期測試:ORA-01855: AM/A.M. or PM/P.M. required
5).客戶端NLS_LANG設(shè)置為SIMPLIFIED CHINESE_CHINA.ZHS16GBK:
中文字符測試:插入/顯示中文均為正常
中文日期測試:插入/顯示中文日期均為正常,格式為DD-MM-YY(例如:08-1月 -08)
4.測試結(jié)論:
從測試結(jié)果來看,當(dāng)數(shù)據(jù)庫端字符集為ZHS16GBK時(shí),能夠使到中文字符被正常插入/顯示的NLS_LANG的字符集為:ZHS16GBK。
而且要使到中文格式的時(shí)間能夠被正確插入,則NLS_LANG的LANGUAGE和TERRITORY設(shè)置必須為:SIMPLIFIED CHINESE_CHINA
===================================================================
【測試總結(jié)】
===================================================================
從上面兩個(gè)測試的結(jié)果就可以明顯看出,把數(shù)據(jù)庫端的字符集設(shè)置為AL32UTF8比起ZHS16GBK更加有優(yōu)勢。
UTF8支持從客戶端應(yīng)用字符集為WE8MSWIN1252、ZHS16GBK、AL32UTF8的環(huán)境下進(jìn)行中文字符的插入,而ZHS16GBK只支持客戶端應(yīng)用字符集為ZHS16GBK環(huán)境下的的中文字符插入。
其次我們來看看日期格式為:01/08/2008 04:14:00 下午的記錄為什么只能在NLS_LANG的LANGUAGE和TERRITORY為SIMPLIFIED CHINESE_CHINA的情況下才能正確插入?
我們知道客戶端NLS_LANG的值由3部分構(gòu)成,即<LANUAGE>_<TERRITORY>.<CHARACTERSET>,而掌管日期中月份和日顯示的恰恰就是<LANGUAGE>部分,所以很明顯<LANGUAGE>為AMERICAN的情況下,是不可能正確插入的(西方用AM、PM來表示上、下午)。
依次類推,如果以后出現(xiàn)貨幣和數(shù)字格式、地區(qū)和計(jì)算星期及日期的習(xí)慣插入、轉(zhuǎn)換失敗,那么我們就要檢查第二個(gè)元素<TERRITORY>。
===================================================================
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關(guān)文章:
|
||
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | |||
6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
27 | 28 | 29 | 30 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
常用鏈接
留言簿(21)
隨筆分類
- J2EE 框架(9)
- J2EE基礎(chǔ)(4)
- J2SE(43)
- Java 工具(5)
- Oracle Concept(4)
- Oracle SQL/PLSQL(9)
- Oracle 開發(fā)(13)
- Oracle 管理(4)
- Oracle 調(diào)優(yōu)
- Oracle 錯(cuò)誤診斷
- RoR(19)
- UML(3)
- Unix / Linux(13)
- Web基礎(chǔ)(19)
- 其它技術(shù)(7)
- 感悟(3)
- 雜項(xiàng)(7)
- 架構(gòu)與性能(8)
- 模式與重構(gòu)(19)
- 灌水(8)
- 電影與音樂(16)
- 走過的路(1)
- 軟件過程與軟件方法(3)
- 陽光戶外(2)
- 項(xiàng)目管理(36)
隨筆檔案
- 2012年2月 (3)
- 2011年11月 (4)
- 2011年10月 (1)
- 2011年9月 (2)
- 2011年8月 (2)
- 2011年7月 (5)
- 2011年6月 (3)
- 2011年5月 (1)
- 2011年4月 (1)
- 2011年3月 (3)
- 2011年1月 (1)
- 2010年12月 (1)
- 2010年11月 (5)
- 2010年10月 (3)
- 2010年9月 (1)
- 2010年7月 (1)
- 2010年6月 (1)
- 2010年5月 (4)
- 2010年4月 (9)
- 2010年3月 (19)
- 2010年2月 (8)
- 2010年1月 (3)
- 2009年12月 (34)
- 2009年11月 (1)
- 2009年10月 (2)
- 2009年7月 (4)
- 2009年6月 (5)
- 2009年5月 (3)
- 2009年4月 (2)
- 2009年3月 (1)
- 2009年2月 (5)
- 2009年1月 (5)
- 2008年12月 (13)
- 2008年11月 (4)
- 2008年10月 (1)
- 2008年9月 (6)
- 2008年8月 (5)
- 2008年7月 (3)
- 2008年6月 (31)
- 2008年5月 (10)
- 2008年4月 (9)
- 2008年3月 (7)
- 2008年2月 (4)
- 2008年1月 (19)
BlogJava熱點(diǎn)博客
好友博客
搜索
最新評(píng)論

- 1.?re: 【Java基礎(chǔ)專題】編碼與亂碼(01)---編碼基礎(chǔ)[未登錄]
- 666666666666666666666這幾天正在做個(gè)類似工程編碼出現(xiàn)錯(cuò)誤
- --李
- 2.?re: 【Java基礎(chǔ)專題】IO與文件讀寫---使用Apache commons IO簡化文件讀寫
- 不錯(cuò)
- --阿斯蘭
- 3.?re: 【Java基礎(chǔ)專題】編碼與亂碼(03)----String的toCharArray()方法
- 多謝分享
- --thx
- 4.?re: 【Java基礎(chǔ)專題】編碼與亂碼(05)---GBK與UTF-8之間的轉(zhuǎn)換
- 評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
- --karl
- 5.?re: 【Java基礎(chǔ)專題】編碼與亂碼(01)---編碼基礎(chǔ)[未登錄]
- 謝謝,幫了我大忙!
- --小龍