搜索
登錄
注冊
網(wǎng)絡(luò)優(yōu)化工程師招聘專欄
4G/LTE通信工程師最新職位列表
通信實習生/應屆生招聘職位
MSCBSC 移動通信論壇
»
通信軟件開發(fā)與發(fā)布
» java 與 mysql 中文問題的處理(ZT)
討論帖
資料帖
投票帖
懸賞帖
閱讀:
3719
回復:
3
關(guān)注樓主
[交流]
java 與 mysql 中文問題的處理(ZT)
xiaorf
銀牌會員
發(fā)短消息
關(guān)注Ta
積分 4838
帖子 183
威望 221654 個
禮品券 160 個
專家指數(shù) 411
注冊 2008-8-2
專業(yè)方向 software
回答問題數(shù)
0
回答被采納數(shù)
0
回答采納率
0%
#1
大
中
小
使用道具
發(fā)表于 2009-03-22 13:13:11
只看樓主
java 與 mysql 中文問題的處理 sliant(原作)
關(guān)鍵字java mysql jdbc GBK unicode character charset 中文 字符集 數(shù)據(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ù)庫中的東西都是二進制存放的,支持任何數(shù)據(jù),當然包括中文。你到命令行下
insert into testtable values ( '中文' );
select * from testtable;
全都顯示正常。
但是,雖然存取中文沒問題,但排序、匹配的時候有問題。所以如果你的數(shù)據(jù)庫里有中文的話,記得在配置文件中,如 c:\winnt\my.ini 中的 [mysqld] 里添加一行:
default-character-set=gbk
然后重啟 mysql server 。 注意 gbk 要小寫,不然 mysqld 啟動不了。
其次,數(shù)據(jù)庫沒問題,下面看看 java 程序。在程序里很無聊地加一句調(diào)試語句:
out.println("中文");
也顯示正常,說明整個 java 環(huán)境沒問題。
所以,當然是聯(lián)系 java 和 mysql 的部分,mysql jdbc driver 出問題了。
分析一下,java 內(nèi)部使用 unicode ,而 mysql 缺省使用 iso-8xxx(忘了),所以 jdbc driver 把查詢字符串傳給 mysql server 時,會做 unicode->iso-8xxx 的轉(zhuǎn)換,從 mysql server 接受結(jié)果時,會做 iso-8xxx->unicode 的轉(zhuǎn)換。(在屏幕上顯示結(jié)果時會 unicode->GBK,不過不關(guān)這里的事。)
這就有問題了,我在命令行下插入數(shù)據(jù)庫的中文字符串是 GBK (這是簡體中文 windows 的默認),所以 jdbc driver 接受查詢結(jié)果時,應該做 GBK->unicode 的轉(zhuǎn)換才對。
驗證一下,對從數(shù)據(jù)庫中讀出的中文字串 s ,
new String( s.getByte("iso-8xxx"), "gbk" )
將 s 先做一個 unicode->iso-8xxx 轉(zhuǎn)換成它存放在數(shù)據(jù)庫中的原始模樣。我們知道它是 gbk ,所以手工來 gbk->unicode ,這樣 java 程序就顯式正常了。
類似,寫入數(shù)據(jù)庫的時候,我們期待 jdbc driver 會把 unicode->gbk ,結(jié)果卻是 unicode->iso-8xxx ,當然是亂碼了。
有很多文章,就到此為止,并告訴我們:要解決中文問題,自己手工轉(zhuǎn)碼吧。
這實在是不負責任。如果每一個字符串都要手工轉(zhuǎn)碼,說明程序設(shè)計出了問題。
想一想,寫 mysql jdbc driver 的家伙會連轉(zhuǎn)碼都不知道?
所以我看看 connector-j-3.0.7 里面的 readme, 找到一個解決方案:
connection = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=root&password=&useUnicode=true&characterEncoding=GBK" );
這是告訴 jdbc driver 強制按指定參數(shù)轉(zhuǎn)碼
其實還是有問題。如果 mysql server 一定得用 iso-8xxx ,那就只有用上一個辦法了。但我記得我的 mysql 是 gbk ,不是都改過 my.ini 了嗎? jdbc driver 怎么都不自動探測 mysql server 的字符集呢?
這個時候就看到開放源碼的好處了 :-) connector-j-3.0.7 源碼中確實有代碼讀取 mysql server 的信息,包括字符集。從注釋中知道,
作者為 unicode 轉(zhuǎn)換到單字節(jié)字符集寫了自己的轉(zhuǎn)換函數(shù),并號稱比 jvm 的快百分之多少多少。所以代碼中有一段,判段數(shù)據(jù)庫如果使用的是單字節(jié)就調(diào)用自己的轉(zhuǎn)換函數(shù)。但這段代碼后面就忘了把多字節(jié)字符集交給 jvm 去轉(zhuǎn)換了,所以變成了缺省的 iso-8xxx 轉(zhuǎn)換。
我的修改方式: com\mysql\jdbc\Connecter.java 這個文件的 1969 行,
this.doUnicode = true; // force the issue
將之上移四行到 1964 行,放在下面這一行的前面:
try {
用這份代碼重新編出來的 jdbc driver ,你的 java 訪問數(shù)據(jù)庫的程序不用做任何修改就可以正確讀寫中文了,不過要記得 mysql server 要 default-character-set=gbk
我使用它測試了幾個小程序,中文都顯示正常,而且都沒死機、異常。呵呵,自我感覺很好。
掃碼關(guān)注5G通信官方公眾號,免費領(lǐng)取以下5G精品資料
1、回復“
YD5GAI
”免費領(lǐng)取《
中國移動:5G網(wǎng)絡(luò)AI應用典型場景技術(shù)解決方案白皮書
》
2、回復“
5G6G
”免費領(lǐng)取《
5G_6G毫米波測試技術(shù)白皮書-2022_03-21
》
3、回復“
YD6G
”免費領(lǐng)取《
中國移動:6G至簡無線接入網(wǎng)白皮書
》
4、回復“
LTBPS
”免費領(lǐng)取《
《中國聯(lián)通5G終端白皮書》
》
5、回復“
ZGDX
”免費領(lǐng)取《
中國電信5G NTN技術(shù)白皮書
》
6、回復“
TXSB
”免費領(lǐng)取《
通信設(shè)備安裝工程施工工藝圖解
》
7、回復“
YDSL
”免費領(lǐng)取《
中國移動算力并網(wǎng)白皮書
》
8、回復“
5GX3
”免費領(lǐng)取《
R16 23501-g60 5G的系統(tǒng)架構(gòu)1
》
共獲得 1 次點評
我要點評
devil
專家指數(shù) +5
· 原創(chuàng)內(nèi)容
詳細..
發(fā)表與:2009-3-26 00:34:09
[
充值威望,立即自動到帳
] [
VIP貴賓權(quán)限+威望套餐
] 另有大量優(yōu)惠贈送活動,請光臨充值中心
充值擁有大量的威望和最高的下載權(quán)限,下載站內(nèi)資料無憂
liangchonga
論壇元老
發(fā)短消息
關(guān)注Ta
積分 18754
帖子 1705
威望 346670 個
禮品券 25 個
專家指數(shù) -115
注冊 2009-2-10
專業(yè)方向 網(wǎng)絡(luò)優(yōu)化
回答問題數(shù)
0
回答被采納數(shù)
0
回答采納率
0%
#2
大
中
小
使用道具
發(fā)表于 2009-03-22 14:31:31
技術(shù)問題,回答得專家指數(shù),快速升級
這是怎么問題?
在線,28天前提問
咋們的網(wǎng)站論壇怎么登不了,續(xù)簽沒有辦法繼續(xù)
在線,77天前提問
現(xiàn)在還有資料賣嗎
在線,86天前提問
這個論壇沒有辦法查看發(fā)的帖子的閱讀量嗎
在線,115天前提問
微信號綁定錯誤怎么辦
在線,138天前提問
這個紙質(zhì)版,怎么買啊
在線,146天前提問
聯(lián)通的手機不能訪問論壇,解釋論壇的地址是加拿大地.
在線,164天前提問
有沒有做基站覆蓋仿真的軟件?
在線,192天前提問
技術(shù)創(chuàng)新與市場策略的調(diào)整,將成為決定企業(yè)能否在全.
在線,195天前提問
終端熄屏進入 Idle 態(tài)?
在線,205天前提問
有些資料能幫忙找嗎
在線,223天前提問
大陸版谷歌打不開,有什么辦法嘛
在線,229天前提問
華為GSC高級和網(wǎng)優(yōu)高級有什么區(qū)別
在線,239天前提問
請問客服在嗎?
在線,256天前提問
信號好,volte通話雜音可能原因
在線,285天前提問
有幾個月了。
在線,293天前提問
啊 ,論壇還有這個板塊 呵呵第一次進來!
對本帖內(nèi)容的看法?
我要點評
[
立即成為VIP會員,百萬通信專業(yè)資料立即下載,支付寶、微信付款,簡單、快速!
]
yale
中級會員
發(fā)短消息
關(guān)注Ta
積分 1070
帖子 43
威望 207 個
禮品券 0 個
專家指數(shù) 0
注冊 2009-2-26
專業(yè)方向 移動通訊
回答問題數(shù)
0
回答被采納數(shù)
0
回答采納率
0%
#3
大
中
小
使用道具
發(fā)表于 2009-04-05 21:25:07
呵呵 樓主精神可嘉
對本帖內(nèi)容的看法?
我要點評
最新通信職位:
廣東通信人才網(wǎng)
|
北京通信人才網(wǎng)
|
上海通信人才網(wǎng)
|
南京通信人才網(wǎng)
|
西安通信人才網(wǎng)
|
重慶通信人才網(wǎng)
|
中國通信人才網(wǎng)
xhblinne2008
金牌會員
發(fā)短消息
關(guān)注Ta
積分 5094
帖子 395
威望 3430 個
禮品券 0 個
專家指數(shù) 6
注冊 2009-4-6
專業(yè)方向 移動通信工程師
回答問題數(shù)
0
回答被采納數(shù)
0
回答采納率
0%
#4
大
中
小
使用道具
發(fā)表于 2009-04-19 21:50:41
剛剛接觸,還得好好努力學習啊
對本帖內(nèi)容的看法?
我要點評
[
2分鐘擁有VIP權(quán)限和充足威望,可下載站內(nèi)任何資料
] [
快速找到一份高薪的通信行業(yè)職位
]
討論帖
資料帖
投票帖
懸賞帖
快速回復主題
標題
[交流] java 與 mysql 中文問題的處理(ZT)" tabindex="1">
內(nèi)容
上傳資料請點左側(cè)【添加附件】
您即將訪問其它網(wǎng)站
關(guān)閉
您即將訪問的地址是其它網(wǎng)站的內(nèi)容,MSCBSC將不再對其安全性和可靠性負責,請自行判斷是否繼續(xù)前往
繼續(xù)訪問
取消訪問,關(guān)閉
當前時區(qū) GMT+8, 現(xiàn)在時間是 2025-05-06 06:39:49
渝ICP備11001752號
Copyright @ 2006-2016 mscbsc.com
本站統(tǒng)一服務(wù)郵箱:mscbsc@163.com
Processed in 0.390932 second(s), 17 queries , Gzip enabled
TOP
清除 Cookies
-
聯(lián)系我們
-
移動通信網(wǎng)
-
移動通信論壇
-
通信招聘網(wǎng)
-
Archiver