Spring+SpringMVC+MyBatis+easyUI整合基礎篇(八)mysql中文查詢bug修復


前言

  在測試搜索時出現的問題,mysql通過中文查詢條件搜索不出數據,但是英文和數字可以搜索到記錄,中文無返回記錄。本文就是寫一下發現問題的過程及解決方法。
 

問題定位過程

 
打開項目地址,進入書籍信息管理
 

 
 
初始化的時候,回傳的結果是所有數據進行分頁后的信息記錄,這里可以看到書名為中文的記錄,但是通過搜索欄的標題欄進行搜索的時候,問題出現了,如下:
 

 
 
沒有返回數據!
一開始我是沒有注意到這是個bug的,因為剛開始整合,很多頁面的js都有些錯誤還沒改,所以我感覺可能是js出了問題,就重新看了一下本頁面的js方法沒有錯誤。然后就試着用英文和數字進行搜索,得到如下結果:
 
 
都有結果返回,又嘗試着用其他中文參數進行查詢,依然沒有數據返回。打開控制台查看后端返回的結果,如圖: 
 
 
后端沒有報錯,只是返回了空數據。到了這一步,已經可以清楚問題出在哪里了,就是中文亂碼問題,導致傳入數據庫的參數不正確,因此無法查出數據。
那么中文亂碼是出現在哪個步驟里呢?因此又開始繼續定位問題,首先是查看http請求,是否在請求時就已經出現中文亂碼的問題,打開控制台,得到如下結果:
 
 
請求頭中的title字段依然為中文字段,並沒有亂碼。那么中文亂碼就不是在前端出現的,可能是數據庫編碼或者后端代碼出現了錯誤導致這個問題。
登錄數據庫查詢數據庫編碼,如圖: 
 
 
切換到當前數據庫,查詢數據庫的編碼格式,結果為utf8,數據庫編碼格式也是正常的,通過數據庫管理工具執行如下sql也是可以查詢到結果的:
 
 
所以問題就一定出現在代碼或配置中,導致程序通過jdbc與mysql間的查詢出現中文亂碼。
查詢程序輸出日志,如圖: 
 
 
整理后:
 
 
通過跟蹤程序日志發現傳入的中文參數一直到dao層都沒有亂碼,但是查詢的結果卻出現了差錯,問題就是jdbc連接了。
 
 
  處理過程總結:發現查詢bug,定位問題,是否為前端js錯誤?是否為http請求時已經中文亂碼?是否為后端http返回報錯?是否為數據庫編碼錯誤?是否為程 序傳參亂碼?是否為jdbc連接錯誤?通過這一系列問題的提出與驗證,最終定位到問題並解決。看到這一過程,步驟挺多的,可能有人會說,不就是一個中文亂碼問 題嗎,至於啰啰嗦嗦講一大堆嗎?我呢,只是記錄一下bug修復的過程,及過程中遇到的小麻煩,這些都需要一一去落實的,不然怎么知道是不是js的錯?是不是http 請求傳參時就已經亂碼?是不是數據庫編碼格式真的不是utf8......
  雖然步驟有些多但是有些問題其實只需要簡單的驗證即可知道結果,重要的是細心和耐心,發現了問題就要解決,要去解決就不能怕麻煩,也不能怕找不到問 題,無非是你的決心和方法,而且碰到的多了,自然而然定位問題就會快很多,共勉。

結果

  通過jdbc與mysql數據庫建立連接時,如果數據庫的編碼格式為utf8,那連接的URL也應該為UTF-8的形式傳遞參數到數據庫才不會出現亂碼,為了減少亂碼, 建議數據庫的連接和傳遞的參數的編碼一致,詳細如下:
  jdbc:mysql://localhost:3306/ssm_demo_db?useUnicode=true&characterEncoding=UTF-8('&'符號可能會亂碼,所以可以用轉義字符&來替換)   
 
 
tip:最近開發任務慢慢增多,暫時就不更新了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM