程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 分享實戰Mysql數據庫中中文亂碼的真實案例

分享實戰Mysql數據庫中中文亂碼的真實案例

編輯:關於MYSQL數據庫
於MySQL中文亂碼的問題,可以說做程序開發的人都基本上會遇到,好端端的中文,到了數據庫中就變成了??,???或者是一些其它的怪字符,這樣的問題,都叫人頭痛。網上的文章,也是百花齊放,這個是遇到這樣的問題,那個又是遇到其它的問題,讓參考的人很是糾結。由於字符集一般有gbk,utf-8,gb2312,big5等,比如說做J2EE開發的人,從Java代碼字符集,JSP文件的字符集,再到數據庫的字符集,數據表的字符集,服務器的字符集,數據源的字符集...可能一段中文文字,經過若干個環境轉換後,如果每個環境下字符集不一致,在每個環境下看到的文字就可能完全不一樣了,這就需要我們仔細分析,每個環境下編碼,解碼的過程了。否則這個中文亂碼的問題,就是一件讓人頭痛的問題了!

  下面阿堂就將我前段時間,遇到一個讓我糾結幾天的MySQL中文亂碼的現象和最終的解決方法和網友們分享一下,相信一定會對網友們有所幫助的!

現象

  我們項目組開發的項目本身是用的utf-8的字符集,因為人部署到騰訊的平台上,所以就用了騰訊的DB數據庫服務器,這台服務器,是可以讓我們隨意配置的,所以將DB數據庫服務器的字符集配置成如下顯示

程序中連數據庫的配置如下

<connection-url>jdbc:MySQL://10.139.120.128/wsgame?useUnicode=true</connection-url>

  這樣通過程序讀寫數據庫中的中文到頁面,非常正常,沒有一點問題!

  後來,由於騰訊給我們提供了CDB服務,一種數據庫集群的服務,我們每個應用是用的騰訊提供的雲數據的一個MySQL實例。結果麻煩來了,由於CDB是公共的一個大環境,上面很多默認的字符集是latin語,騰訊作了限制,不允許應用用戶去改CDB環境下的字符集,說是不可能根據個別用戶去定制字符集。這樣麻煩就來了,中文進入到數據庫成了亂碼??或???,通過程序讀寫到JSP頁面時,也是成了??或???.郁悶了好幾天。阿堂也積極找公司的DBA和騰訊的DBA多方尋找幫助,得到了一些幫助,但是最終還是未能真正解決問題.一折騰就是一個多星期,弄得周末都讓我去多方查找資料!真是很糾結!

騰訊CDB字符集支持的環境如下

轉折點 昨天又和騰訊的DBA交流時,他的一句話提醒了我"我們經常碰到這個樣的問題,其實只要保證 connect MySQL 的時候設置的字符集跟庫表設置的字符集(show create table 可以查到)一樣的話就沒有問題"
依此思路,阿堂作了如下操作,一切問題,就迎刃而解了 1.查詢確認我的數據庫和數據庫的字符集確認為utf-8

程序中連接數據源的設置作了如下變動
<connection-url>jdbc:MySQL://10.139.120.128/wsgame?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8</connection-url>
至此再通過程序訪問,現在就可以保證正常讀寫數據庫中的中文一切ok 了!
總結: 原則上當數據庫中的字符集我們可以任意修改的時候,我們設置成我們程序中的字符集一致,則&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8 完全可以不設置。象我上面用db數據庫服務器時,由於我們將各種環境下的字符集都設置成utf-8了,所以程序中連數據源的字符集就可以完全不用設置,也不會報錯。但是連CDB時,由於字符集是用的latin拉丁語,而且我們沒有辦法去修改,就必須在程序中連數據源的時候指定字符集了。歸納一句,程序中連數據源的時候,最好指定字符集,這樣不會出現此類的怪現象了! 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved