mysql亂碼問(wèn)題分析與解決方法
更新時(shí)間:2012年11月29日 11:18:15 作者:
開發(fā)過(guò)程中總避免不了遇到惡心的亂碼,或者由亂碼引發(fā)的一系列問(wèn)題,這里簡(jiǎn)要介紹一下自己遇到的亂碼問(wèn)題和解決問(wèn)題的過(guò)程中的想法以及大致的操作
開發(fā)過(guò)程中總避免不了遇到惡心的亂碼,或者由亂碼引發(fā)的一系列問(wèn)題。出現(xiàn)亂碼是字符集的原因一般而言和邏輯沒有太大關(guān)系,也就是說(shuō)整個(gè)系統(tǒng)大的方向沒有問(wèn)題,小的地方出現(xiàn)了漏洞,進(jìn)而導(dǎo)致程序不能正常運(yùn)行,所以說(shuō)出現(xiàn)亂碼是一件令人非常很惡心的事情。這里簡(jiǎn)要介紹一下自己遇到的亂碼問(wèn)題和解決問(wèn)題的過(guò)程中的想法以及大致的操作,我們要學(xué)會(huì)的是如何分析問(wèn)題進(jìn)而解決問(wèn)題,而不僅僅是照著網(wǎng)上的操作去一次次的解決眼前的困難,“魚”與“漁”的區(qū)別就在于此。
交代背景:
要實(shí)現(xiàn)的功能很簡(jiǎn)單,用dom4J讀取XML文件然后借助Spring以及Hibernate將數(shù)據(jù)寫入到MySql數(shù)據(jù)庫(kù)(多表)中,當(dāng)然整個(gè)過(guò)程是由Spring控制事務(wù)一次性完成,有異常進(jìn)行回滾。
現(xiàn)象:在往數(shù)據(jù)庫(kù)里寫數(shù)據(jù)寫到一半的時(shí)候報(bào)錯(cuò),大致的錯(cuò)誤信息是:記錄不是唯一。
分析和操作:
檢查了一遍自己的代碼,用Spring當(dāng)中的HibernateTemplete保存數(shù)據(jù),應(yīng)該沒有問(wèn)題。
再次觀察現(xiàn)象:好像是外鍵約束的問(wèn)題,因?yàn)槊慨?dāng)插入到帶有外鍵的表的時(shí)候數(shù)據(jù)死活錄入不進(jìn)去。
分析和操作:
既然是外鍵表的問(wèn)題,首先應(yīng)該確定外鍵表中的內(nèi)容是什么,于是手動(dòng)改數(shù)據(jù)庫(kù)隔離等級(jí)查看數(shù)據(jù),果然里面是亂碼!
問(wèn)題:亂碼是怎么進(jìn)入數(shù)據(jù)庫(kù)的?
分析和操作:
要么讀取xml的時(shí)候就是亂碼,要么在往數(shù)據(jù)庫(kù)里寫的時(shí)候變成亂碼。再次斷點(diǎn)調(diào)試測(cè)試在程序中是否亂碼。
現(xiàn)象:在eclipse當(dāng)中打印出來(lái)信息沒有出現(xiàn)亂碼問(wèn)題
分析與操作:
這就說(shuō)明在程序中一切沒有問(wèn)題,是數(shù)據(jù)庫(kù)的問(wèn)題。于是先改數(shù)據(jù)庫(kù)鏈接字符串指定編碼,再改數(shù)據(jù)庫(kù)的編碼,再次斷點(diǎn)調(diào)試。
現(xiàn)象:數(shù)據(jù)庫(kù)中依然是亂碼,但是亂碼的形式換了,之前全是“?”現(xiàn)在是一些亂七八糟的文字。
分析和操作:
很明顯上面一系列修改編碼格式的操作起作用了,只是沒有修改對(duì)而已。再次檢查各項(xiàng)的編碼格式,沒有發(fā)現(xiàn)問(wèn)題
問(wèn)題一度陷入僵局……
尋求幫助:秋提出別用命令窗口了,太麻煩了,用第三方客戶端吧,于是換用第三方客戶端,奇怪的是客戶端顯示沒有問(wèn)題!
分析和操作:
客戶端沒有問(wèn)題命令窗口有問(wèn)題,那就說(shuō)明數(shù)據(jù)庫(kù)里已經(jīng)不是亂碼,亂碼可能是命令行顯示的問(wèn)題。設(shè)置命令行顯示字符,果然顯示正常!再次測(cè)試數(shù)據(jù)導(dǎo)入----一切OK。
思考與總結(jié):
現(xiàn)象:其實(shí)在第一次修改完各項(xiàng)編碼的時(shí)候這個(gè)問(wèn)題已經(jīng)算是解決了,但是由于當(dāng)時(shí)自己斷點(diǎn)調(diào)試的時(shí)候沒有讓程序執(zhí)行完所以一直認(rèn)為數(shù)據(jù)庫(kù)中依然是亂碼。
總結(jié):
應(yīng)該在每次調(diào)試的時(shí)候讓程序跑完,將錯(cuò)誤的上下文環(huán)境模擬出來(lái),而不是只關(guān)注錯(cuò)誤本身。
現(xiàn)象:在這里涉及到編碼的地方有XML的編碼、dom4j的讀取編碼、數(shù)據(jù)庫(kù)編碼、數(shù)據(jù)庫(kù)連接字符串指定編碼、命令行窗口顯示編碼。這其中哪個(gè)沒有注意到問(wèn)題也解決不了(這里自己沒有意識(shí)到最后一個(gè))。
總結(jié):
全局觀的意思是把握每個(gè)控制變量,從開始到結(jié)束,有意識(shí)的跳出環(huán)境來(lái)做假設(shè)。
交代背景:
要實(shí)現(xiàn)的功能很簡(jiǎn)單,用dom4J讀取XML文件然后借助Spring以及Hibernate將數(shù)據(jù)寫入到MySql數(shù)據(jù)庫(kù)(多表)中,當(dāng)然整個(gè)過(guò)程是由Spring控制事務(wù)一次性完成,有異常進(jìn)行回滾。
現(xiàn)象:在往數(shù)據(jù)庫(kù)里寫數(shù)據(jù)寫到一半的時(shí)候報(bào)錯(cuò),大致的錯(cuò)誤信息是:記錄不是唯一。
分析和操作:
檢查了一遍自己的代碼,用Spring當(dāng)中的HibernateTemplete保存數(shù)據(jù),應(yīng)該沒有問(wèn)題。
再次觀察現(xiàn)象:好像是外鍵約束的問(wèn)題,因?yàn)槊慨?dāng)插入到帶有外鍵的表的時(shí)候數(shù)據(jù)死活錄入不進(jìn)去。
分析和操作:
既然是外鍵表的問(wèn)題,首先應(yīng)該確定外鍵表中的內(nèi)容是什么,于是手動(dòng)改數(shù)據(jù)庫(kù)隔離等級(jí)查看數(shù)據(jù),果然里面是亂碼!
問(wèn)題:亂碼是怎么進(jìn)入數(shù)據(jù)庫(kù)的?
分析和操作:
要么讀取xml的時(shí)候就是亂碼,要么在往數(shù)據(jù)庫(kù)里寫的時(shí)候變成亂碼。再次斷點(diǎn)調(diào)試測(cè)試在程序中是否亂碼。
現(xiàn)象:在eclipse當(dāng)中打印出來(lái)信息沒有出現(xiàn)亂碼問(wèn)題
分析與操作:
這就說(shuō)明在程序中一切沒有問(wèn)題,是數(shù)據(jù)庫(kù)的問(wèn)題。于是先改數(shù)據(jù)庫(kù)鏈接字符串指定編碼,再改數(shù)據(jù)庫(kù)的編碼,再次斷點(diǎn)調(diào)試。
現(xiàn)象:數(shù)據(jù)庫(kù)中依然是亂碼,但是亂碼的形式換了,之前全是“?”現(xiàn)在是一些亂七八糟的文字。
分析和操作:
很明顯上面一系列修改編碼格式的操作起作用了,只是沒有修改對(duì)而已。再次檢查各項(xiàng)的編碼格式,沒有發(fā)現(xiàn)問(wèn)題
問(wèn)題一度陷入僵局……
尋求幫助:秋提出別用命令窗口了,太麻煩了,用第三方客戶端吧,于是換用第三方客戶端,奇怪的是客戶端顯示沒有問(wèn)題!
分析和操作:
客戶端沒有問(wèn)題命令窗口有問(wèn)題,那就說(shuō)明數(shù)據(jù)庫(kù)里已經(jīng)不是亂碼,亂碼可能是命令行顯示的問(wèn)題。設(shè)置命令行顯示字符,果然顯示正常!再次測(cè)試數(shù)據(jù)導(dǎo)入----一切OK。
思考與總結(jié):
現(xiàn)象:其實(shí)在第一次修改完各項(xiàng)編碼的時(shí)候這個(gè)問(wèn)題已經(jīng)算是解決了,但是由于當(dāng)時(shí)自己斷點(diǎn)調(diào)試的時(shí)候沒有讓程序執(zhí)行完所以一直認(rèn)為數(shù)據(jù)庫(kù)中依然是亂碼。
總結(jié):
應(yīng)該在每次調(diào)試的時(shí)候讓程序跑完,將錯(cuò)誤的上下文環(huán)境模擬出來(lái),而不是只關(guān)注錯(cuò)誤本身。
現(xiàn)象:在這里涉及到編碼的地方有XML的編碼、dom4j的讀取編碼、數(shù)據(jù)庫(kù)編碼、數(shù)據(jù)庫(kù)連接字符串指定編碼、命令行窗口顯示編碼。這其中哪個(gè)沒有注意到問(wèn)題也解決不了(這里自己沒有意識(shí)到最后一個(gè))。
總結(jié):
全局觀的意思是把握每個(gè)控制變量,從開始到結(jié)束,有意識(shí)的跳出環(huán)境來(lái)做假設(shè)。
相關(guān)文章
Mysql大數(shù)據(jù)量查詢優(yōu)化思路詳析
這篇文章主要介紹了Mysql大數(shù)據(jù)量查詢優(yōu)化思路,Mysql大表查詢優(yōu)化,理論上千萬(wàn)級(jí)別以下的數(shù)據(jù)量Mysql單表查詢性能處理都是可以的。下文我們就來(lái)看看具體得思路解析2022-01-01mysql5.7.18解壓版啟動(dòng)mysql服務(wù)
這篇文章主要為大家詳細(xì)介紹了mysql5.7.18解壓版啟動(dòng)mysql服務(wù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05mysql 5.7 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié),需要的朋友可以參考下2017-09-09Mysql優(yōu)化order by語(yǔ)句的方法詳解
本篇文章我們將了解ORDER BY語(yǔ)句的優(yōu)化,在文中給大家提到了mysql中的兩種排序方式,需要的朋友參考下吧2018-08-08MySQL優(yōu)化之如何寫出高質(zhì)量sql語(yǔ)句
在數(shù)據(jù)庫(kù)日常維護(hù)中,最常做的事情就是SQL語(yǔ)句優(yōu)化,因?yàn)檫@個(gè)才是影響性能的最主要因素。這篇文章主要給大家介紹了關(guān)于MySQL優(yōu)化之如何寫出高質(zhì)量sql語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2021-05-05