MSCBSC 移動(dòng)通信論壇
搜索
登錄注冊(cè)
網(wǎng)絡(luò)優(yōu)化工程師招聘專欄 4G/LTE通信工程師最新職位列表 通信實(shí)習(xí)生/應(yīng)屆生招聘職位

  • 閱讀:3674
  • 回復(fù):3
[交流] java 與 mysql 中文問題的處理(ZT)
xiaorf
銀牌會(huì)員



 發(fā)短消息    關(guān)注Ta 

積分 4838
帖子 183
威望 221654 個(gè)
禮品券 160 個(gè)
專家指數(shù) 411
注冊(cè) 2008-8-2
專業(yè)方向  software
回答問題數(shù) 0
回答被采納數(shù) 0
回答采納率 0%
 
發(fā)表于 2009-03-22 13:13:11  只看樓主 
java 與 mysql 中文問題的處理 sliant(原作)

關(guān)鍵字java mysql jdbc GBK unicode character charset 中文 字符集 數(shù)據(jù)庫


終于搞定了,特寫一篇文章來紀(jì)念一下 :-)


我的環(huán)境:
中文簡體 win2000 pro + sp3
mysql server 4.0.12
j2sdk 1.4.01
connetcor-j 3.0.7


問題:用 jdbc 插入、讀取數(shù)據(jù)庫種文字串亂碼。


首先,mysql 數(shù)據(jù)庫中的東西都是二進(jìn)制存放的,支持任何數(shù)據(jù),當(dāng)然包括中文。你到命令行下
insert into testtable values ( '中文' );
select * from testtable;
全都顯示正常。
但是,雖然存取中文沒問題,但排序、匹配的時(shí)候有問題。所以如果你的數(shù)據(jù)庫里有中文的話,記得在配置文件中,如 c:\winnt\my.ini 中的 [mysqld] 里添加一行:
default-character-set=gbk
然后重啟 mysql server 。 注意 gbk 要小寫,不然 mysqld 啟動(dòng)不了。


其次,數(shù)據(jù)庫沒問題,下面看看 java 程序。在程序里很無聊地加一句調(diào)試語句:
out.println("中文");
也顯示正常,說明整個(gè) java 環(huán)境沒問題。


所以,當(dāng)然是聯(lián)系 java 和 mysql 的部分,mysql jdbc driver 出問題了。
分析一下,java 內(nèi)部使用 unicode ,而 mysql 缺省使用 iso-8xxx(忘了),所以 jdbc driver 把查詢字符串傳給 mysql server 時(shí),會(huì)做 unicode->iso-8xxx 的轉(zhuǎn)換,從 mysql server 接受結(jié)果時(shí),會(huì)做 iso-8xxx->unicode 的轉(zhuǎn)換。(在屏幕上顯示結(jié)果時(shí)會(huì) unicode->GBK,不過不關(guān)這里的事。)
這就有問題了,我在命令行下插入數(shù)據(jù)庫的中文字符串是 GBK (這是簡體中文 windows 的默認(rèn)),所以 jdbc driver 接受查詢結(jié)果時(shí),應(yīng)該做 GBK->unicode 的轉(zhuǎn)換才對(duì)。
驗(yàn)證一下,對(duì)從數(shù)據(jù)庫中讀出的中文字串 s ,
new String( s.getByte("iso-8xxx"), "gbk" )
將 s 先做一個(gè) unicode->iso-8xxx 轉(zhuǎn)換成它存放在數(shù)據(jù)庫中的原始模樣。我們知道它是 gbk ,所以手工來 gbk->unicode ,這樣 java 程序就顯式正常了。
類似,寫入數(shù)據(jù)庫的時(shí)候,我們期待 jdbc driver 會(huì)把 unicode->gbk ,結(jié)果卻是 unicode->iso-8xxx ,當(dāng)然是亂碼了。


有很多文章,就到此為止,并告訴我們:要解決中文問題,自己手工轉(zhuǎn)碼吧。
這實(shí)在是不負(fù)責(zé)任。如果每一個(gè)字符串都要手工轉(zhuǎn)碼,說明程序設(shè)計(jì)出了問題。
想一想,寫 mysql jdbc driver 的家伙會(huì)連轉(zhuǎn)碼都不知道?
所以我看看 connector-j-3.0.7 里面的 readme, 找到一個(gè)解決方案:
connection = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=root&password=&useUnicode=true&characterEncoding=GBK" );
這是告訴 jdbc driver 強(qiáng)制按指定參數(shù)轉(zhuǎn)碼


其實(shí)還是有問題。如果 mysql server 一定得用 iso-8xxx ,那就只有用上一個(gè)辦法了。但我記得我的 mysql 是 gbk ,不是都改過 my.ini 了嗎? jdbc driver 怎么都不自動(dòng)探測(cè) mysql server 的字符集呢?
這個(gè)時(shí)候就看到開放源碼的好處了 :-) connector-j-3.0.7 源碼中確實(shí)有代碼讀取 mysql server 的信息,包括字符集。從注釋中知道,
作者為 unicode 轉(zhuǎn)換到單字節(jié)字符集寫了自己的轉(zhuǎn)換函數(shù),并號(hào)稱比 jvm 的快百分之多少多少。所以代碼中有一段,判段數(shù)據(jù)庫如果使用的是單字節(jié)就調(diào)用自己的轉(zhuǎn)換函數(shù)。但這段代碼后面就忘了把多字節(jié)字符集交給 jvm 去轉(zhuǎn)換了,所以變成了缺省的 iso-8xxx 轉(zhuǎn)換。
我的修改方式: com\mysql\jdbc\Connecter.java 這個(gè)文件的 1969 行,
this.doUnicode = true; // force the issue
將之上移四行到 1964 行,放在下面這一行的前面:
try {
用這份代碼重新編出來的 jdbc driver ,你的 java 訪問數(shù)據(jù)庫的程序不用做任何修改就可以正確讀寫中文了,不過要記得 mysql server 要 default-character-set=gbk
我使用它測(cè)試了幾個(gè)小程序,中文都顯示正常,而且都沒死機(jī)、異常。呵呵,自我感覺很好。
掃碼關(guān)注5G通信官方公眾號(hào),免費(fèi)領(lǐng)取以下5G精品資料
  • 1、回復(fù)“YD5GAI”免費(fèi)領(lǐng)取《中國移動(dòng):5G網(wǎng)絡(luò)AI應(yīng)用典型場(chǎng)景技術(shù)解決方案白皮書
  • 2、回復(fù)“5G6G”免費(fèi)領(lǐng)取《5G_6G毫米波測(cè)試技術(shù)白皮書-2022_03-21
  • 3、回復(fù)“YD6G”免費(fèi)領(lǐng)取《中國移動(dòng):6G至簡無線接入網(wǎng)白皮書
  • 4、回復(fù)“LTBPS”免費(fèi)領(lǐng)取《《中國聯(lián)通5G終端白皮書》
  • 5、回復(fù)“ZGDX”免費(fèi)領(lǐng)取《中國電信5G NTN技術(shù)白皮書
  • 6、回復(fù)“TXSB”免費(fèi)領(lǐng)取《通信設(shè)備安裝工程施工工藝圖解
  • 7、回復(fù)“YDSL”免費(fèi)領(lǐng)取《中國移動(dòng)算力并網(wǎng)白皮書
  • 8、回復(fù)“5GX3”免費(fèi)領(lǐng)取《 R16 23501-g60 5G的系統(tǒng)架構(gòu)1
  • 共獲得 1 次點(diǎn)評(píng) 我要點(diǎn)評(píng)

    • devil 專家指數(shù) +5
      · 原創(chuàng)內(nèi)容 詳細(xì).. 發(fā)表與:2009-3-26 00:34:09
     
    [充值威望,立即自動(dòng)到帳] [VIP貴賓權(quán)限+威望套餐] 另有大量優(yōu)惠贈(zèng)送活動(dòng),請(qǐng)光臨充值中心
    充值擁有大量的威望和最高的下載權(quán)限,下載站內(nèi)資料無憂
    liangchonga
    論壇元老
    鎵嬫満鍙風(fēng)爜宸查獙璇? style=


     發(fā)短消息    關(guān)注Ta 

    紀(jì)念勛章·三周年  
    積分 18754
    帖子 1705
    威望 346670 個(gè)
    禮品券 25 個(gè)
    專家指數(shù) -115
    注冊(cè) 2009-2-10
    專業(yè)方向  網(wǎng)絡(luò)優(yōu)化
    回答問題數(shù) 0
    回答被采納數(shù) 0
    回答采納率 0%
     
    發(fā)表于 2009-03-22 14:31:31 
    啊 ,論壇還有這個(gè)板塊 呵呵第一次進(jìn)來!

    對(duì)本帖內(nèi)容的看法? 我要點(diǎn)評(píng)

     
    [立即成為VIP會(huì)員,百萬通信專業(yè)資料立即下載,支付寶、微信付款,簡單、快速!]
    yale
    中級(jí)會(huì)員



     發(fā)短消息    關(guān)注Ta 

    積分 1070
    帖子 43
    威望 207 個(gè)
    禮品券 0 個(gè)
    專家指數(shù) 0
    注冊(cè) 2009-2-26
    專業(yè)方向  移動(dòng)通訊
    回答問題數(shù) 0
    回答被采納數(shù) 0
    回答采納率 0%
     
    發(fā)表于 2009-04-05 21:25:07 
    呵呵 樓主精神可嘉

    對(duì)本帖內(nèi)容的看法? 我要點(diǎn)評(píng)

     
    最新通信職位:廣東通信人才網(wǎng) | 北京通信人才網(wǎng) | 上海通信人才網(wǎng) | 南京通信人才網(wǎng) | 西安通信人才網(wǎng) | 重慶通信人才網(wǎng) | 中國通信人才網(wǎng)
    xhblinne2008
    金牌會(huì)員
    鎵嬫満鍙風(fēng)爜宸查獙璇? style=


     發(fā)短消息    關(guān)注Ta 

    積分 5094
    帖子 395
    威望 3430 個(gè)
    禮品券 0 個(gè)
    專家指數(shù) 6
    注冊(cè) 2009-4-6
    專業(yè)方向  移動(dòng)通信工程師
    回答問題數(shù) 0
    回答被采納數(shù) 0
    回答采納率 0%
     
    發(fā)表于 2009-04-19 21:50:41 
    剛剛接觸,還得好好努力學(xué)習(xí)啊

    對(duì)本帖內(nèi)容的看法? 我要點(diǎn)評(píng)

     
    [2分鐘擁有VIP權(quán)限和充足威望,可下載站內(nèi)任何資料] [快速找到一份高薪的通信行業(yè)職位]

    快速回復(fù)主題    
    標(biāo)題 [交流] java 與 mysql 中文問題的處理(ZT)" tabindex="1">
    內(nèi)容
     上傳資料請(qǐng)點(diǎn)左側(cè)【添加附件】

    當(dāng)前時(shí)區(qū) GMT+8, 現(xiàn)在時(shí)間是 2025-02-09 04:53:11
    渝ICP備11001752號(hào)  Copyright @ 2006-2016 mscbsc.com  本站統(tǒng)一服務(wù)郵箱:mscbsc@163.com

    Processed in 0.519891 second(s), 17 queries , Gzip enabled
    TOP
    清除 Cookies - 聯(lián)系我們 - 移動(dòng)通信網(wǎng) - 移動(dòng)通信論壇 - 通信招聘網(wǎng) - Archiver