前言
在測試搜索時出現的問題,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:最近開發任務慢慢增多,暫時就不更新了。