MySQL存儲數(shù)據(jù)亂碼的問題解析
mysql的字符集設置有多個層級,在mysql中存儲中文,如果不能正確設置字符集,很容易出現(xiàn)數(shù)據(jù)亂碼。今天就有一個用戶反饋他數(shù)據(jù)庫中的數(shù)據(jù)下午1點多開始出現(xiàn)了亂碼。在這里,我分享下具體問題的排查過程,以及解決的辦法。
(1) 排除客戶端設置導致的顯示亂碼
如果用戶設置的mysql character_set_client跟客戶端顯示的字符集不一致,很容易導致中文數(shù)據(jù)亂碼。
設置session字符集為utf8:set names utf8,設置客戶端顯示字符集為utf8,然后從表中select出有亂碼的數(shù)據(jù)。

上面顯示,在character_set_client跟客戶端的字符集一致的情況下,還是出現(xiàn)了亂碼,這個排除是用戶顯示字符集設置不對的可能。下面通過hex(item_title)列來查看這個列在底層的存儲字符集是否正確。

通過上面的查詢,可以確認這個數(shù)據(jù)亂碼不是顯示問題,而是存儲的數(shù)據(jù)內(nèi)容本身就是錯誤的。
(2) 定位存儲亂碼原因
1> 用戶確認這個記錄插入時能夠正常顯示,但是后來update之后,數(shù)據(jù)就亂碼了。根據(jù)這個信息到binlog中查找更改正確內(nèi)容對應的update語句。


上面的binlog日志顯示這個sql將原來數(shù)據(jù)庫中正確的內(nèi)容,更新成一堆亂碼。所以導致數(shù)據(jù)庫中的存儲數(shù)據(jù)亂碼。
從binlog日志可以看出在更新時,是用latin1的方式寫入到數(shù)據(jù)庫中。Update后面的set語句中item_title字段的內(nèi)容是亂碼的,所以確認是導入數(shù)據(jù)源本身內(nèi)容有問題,從而導致更新后的數(shù)據(jù)亂碼。跟用戶確認這個update語句的更新內(nèi)容,是先從庫中l(wèi)oad 出來,后拼接成的update sql,所以懷疑load出來的數(shù)據(jù)就已經(jīng)是亂碼了,然后直接用這個錯誤的數(shù)據(jù)更新原來正確的數(shù)據(jù),導致所有的正確的數(shù)據(jù)亂碼。所以,需要確認這個update導入的數(shù)據(jù)源是否正確,即load出來的數(shù)據(jù)是否是正確的。
2> 導入數(shù)據(jù)源確認
開啟實例的全日志開關,然后比對日志,從上面update語句對應的連接運行的sql中查找數(shù)據(jù)導出語句,以及對應的字符集設置。

從上面的日志內(nèi)容可以看出,這個連接建立后沒有進行任何字符集的設置,直接從數(shù)據(jù)庫中將內(nèi)容select出來。在mysql中,如果沒有設置session級別的字符集,那么使用默認的配置,配置如下:

即輸出會按照latin1的格式顯示。在默認字符集的配置下,手動運行SELECT `main_table`.* FROM `promo_item` AS `main_table` WHERE promo_item_id ='500186324' 命令,可以發(fā)現(xiàn),在character_set_results 設置為latin1的情況下,輸出結果中的item_title確實為一堆問號。

由于latin1不能正確表示中文字符,所以顯示為一堆問號,用戶直接將這個內(nèi)容update 原來正確的內(nèi)容,所以導致存儲內(nèi)容亂碼。
(3)小結
在使用mysql存儲中文字符時,需要注意以下幾點:
1> 確認更新的數(shù)據(jù)源同mysql 的session級別的字符集保持一致,Session級別的字符集可以用set names charset_name來設置。
2> 如果要正確顯示中文,需要將character_set_results設置為GBK或是utf8。同時,客戶端的顯示字符集需要跟character_set_results的配置一致。
相關文章
MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案
這篇文章主要介紹了MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
deepin20.1系統(tǒng)安裝MySQL8.0.23(超詳細的MySQL8安裝教程)
這篇文章主要介紹了deepin20.1系統(tǒng)安裝MySQL8.0.23(最美國產(chǎn)Liunx系統(tǒng),最詳細的MySQL8安裝教程),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

