1. 程式人生 > >SpringBoot MySql資料庫中文亂碼問題排查實紀

SpringBoot MySql資料庫中文亂碼問題排查實紀

引言:

最近用StringBoot開發了一個簡單的小程式伺服器,發現通過post請求插入的中文欄位在資料庫中是顯示“???”的形式,本來不以為意,以為是顯示的問題,誰知通過get請求獲取資料的時候返回的也是“???”,這下就開始慌了,於是開始了問題的排查。以下為排查的過程。

首先上網搜尋“mysql中文亂碼”,結果倒是一大堆。
- 排除IDE編碼問題
按照網上的資訊,先排查IDE的問題,看IntellJ是否設定的了UTF-8的編碼格式。
開啟setting->editor->code Style->FileEncodings,發現IDE已經為UTF-8的編碼,因此排除IDE的問題
這裡寫圖片描述

- 檢視伺服器中資料庫實際編碼格式。
使用root使用者登陸資料庫,然後傳送:show variables like 'character%';
結果顯示:
這裡寫圖片描述

可以看到伺服器的編碼方式是latin1。查閱資料後發現該編碼是MySql的預設編碼格式,且該編碼不支援中文,因此需要將編碼改為utf8格式。
問題找到了,接下來就是怎麼樣將該編碼格式改為utf8的問題,本以為很簡單的一件事,卻費了我一天的時間來更改。

以下為修改MySql編碼過程:

  • 使用命令修改資料庫編碼
    按照網上的說法,登陸資料庫,使用命令set character_set_database = utf8;


    發現竟然修改成功了,欣喜若狂。再使用命令show variables like 'character%';檢視修改結果,顯示編碼方式已由latin1改為utf8了。
    以為問題就這樣解決的時候,再次post中文引數,發現還是“???”,更可氣的是,該命令修改完的時候顯示是utf8的,重啟mysql後又重新變為了latin1。

  • 修改my.cnf配置檔案
    上述方式無效,再查,說修改配置檔案my.cnf。在etc/mysql目錄下找到my.cnf檔案,在該檔案新增default-character-set = utf8
    於是使用vim命令編輯該檔案,將以上欄位複製進去,儲存退出。
    然後用service mysql start

    啟動Mysql。
    結果:
    這裡寫圖片描述
    再次淚奔。網上查了這個錯誤是指配置不正確導致不能正常啟動。

再查,還有說在my.cnf里加default-character-set = utf8mb4
“mb4”是什麼鬼?好吧,先試下,或許在伺服器上utf8欄位不一樣呢?
於是再次編輯啟動。
結果:
這裡寫圖片描述
再次失敗告終。

再查,有說在工程jdbc連線新增編碼的jdbc:mysql://localhost:3306/xjp?useUnicode=true&characterEncoding=UTF-8
再試,或許是jdbc的鍋。於是讓my.cnf恢復原來樣子。
於是再次啟動mysql和工程。
能正常運行了,估計這次八九不離十了,然而再次post中文資料過去,還是“???”。天吶,要崩潰了,網上資料那麼多,咋就沒一個能用的呢?

或許是有隱藏開啟方式?於是網上搜索“mysql my.cnf配置”
網上倒是很多對配置項的講解,我也不深究那麼多了,先跑起來再說。於是直接把別人的my.cnf配置複製貼上到我的my.cnf。
再次啟動mysql。
結果:
這裡寫圖片描述
好吧!內心一萬句MMP。

受到my.cnf配置的啟發,於是用windows來做下實驗,看下windows的配置是怎麼樣的。
windows下的mysql配置名為my.ini。於是開啟搜尋”character”,發現檔案有一行#character-set-server=被註釋起來了,再一看說明,原來就是用來設定預設編碼的。於是趕緊取消註釋並加上utf8。
這裡寫圖片描述
然後重新啟動Mysql,發現所有的編碼方式已經修改為utf8。且應用執行後使用post傳遞資料,windows裡的mysql居然能正常顯示了。這時內心彷彿發現新大陸一樣狂燥不已。更令人欣喜的是這個檔案頂部的一行文字:
這裡寫圖片描述
大意是可以直接複製這個檔案內容到linux下的my.cnf。
於是把這些內容複製到伺服器的my.cnf檔案裡,然後啟動MySql。
結果:
這裡寫圖片描述
居然連官方也欺騙我,彷彿全世界要把我拋棄了。淚奔。

就在我快要絕望的時候,一道靈光從天上直接打入了我的天靈蓋,瞬間開竅了。既然老是提示配置出錯,會不會是少加了點什麼東西?於是重新去看windows版本的my.ini檔案,發現配置下面那麼多註釋的英文中間會夾雜著[client]、[mysql]、[mysqld]的字樣。然後查詢了有關的概念。
於是有了這樣配置:
這裡寫圖片描述
就只是在原來的my.cnf檔案後面加上了:

[mysqld]
character-set-server=utf8

再次儲存啟動。
終於能正常運行了。於是激動地要去檢視資料庫編碼。
這裡寫圖片描述
編碼也改為utf8了,感覺這次有戲。
於是把之前的測試資料庫刪掉(保險起見,刪除重建,畢竟被坑怕了),再重新建立及啟動應用。這次post終於能正常儲存中文資料了。這簡直比國足贏了世界盃還要高興。
這裡寫圖片描述

花了那麼多時間,下面總結下這個問題簡單的解決方法:
1、在etc/mysql/目錄下找到my.cnf檔案(該路徑只限預設安裝路徑,自定義路徑自行查詢my.cnf的位置)
2、在該檔案下方新增

[mysqld]
character-set-server=utf8

然後退出儲存重新啟動mysql。如果還是不行,有可能是不支援原來的資料庫直接修改為utf8編碼,請刪庫重新測試。