《MYSQL教程MySQL存儲(chǔ)數(shù)據(jù)亂碼的問(wèn)題解析》要點(diǎn):
本文介紹了MYSQL教程MySQL存儲(chǔ)數(shù)據(jù)亂碼的問(wèn)題解析,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MYSQL教程mysql的字符集設(shè)置有多個(gè)層級(jí),在mysql中存儲(chǔ)中文,如果不能正確設(shè)置字符集,很容易出現(xiàn)數(shù)據(jù)亂碼.今天就有一個(gè)用戶反饋他數(shù)據(jù)庫(kù)中的數(shù)據(jù)下午1點(diǎn)多開始出現(xiàn)了亂碼.在這里,我分享下具體問(wèn)題的排查過(guò)程,以及解決的辦法.
MYSQL教程(1)? 排除客戶端設(shè)置導(dǎo)致的顯示亂碼
MYSQL教程如果用戶設(shè)置的mysql character_set_client跟客戶端顯示的字符集不一致,很容易導(dǎo)致中文數(shù)據(jù)亂碼.
MYSQL教程設(shè)置session字符集為utf8:set names utf8,設(shè)置客戶端顯示字符集為utf8,然后從表中select出有亂碼的數(shù)據(jù).
MYSQL教程
MYSQL教程上面顯示,在character_set_client跟客戶端的字符集一致的情況下,還是出現(xiàn)了亂碼,這個(gè)排除是用戶顯示字符集設(shè)置不對(duì)的可能.下面通過(guò)hex(item_title)列來(lái)查看這個(gè)列在底層的存儲(chǔ)字符集是否正確.
MYSQL教程
MYSQL教程通過(guò)上面的查詢,可以確認(rèn)這個(gè)數(shù)據(jù)亂碼不是顯示問(wèn)題,而是存儲(chǔ)的數(shù)據(jù)內(nèi)容本身就是錯(cuò)誤的.
MYSQL教程(2)? 定位存儲(chǔ)亂碼原因
MYSQL教程1>???? 用戶確認(rèn)這個(gè)記錄插入時(shí)能夠正常顯示,但是后來(lái)update之后,數(shù)據(jù)就亂碼了.根據(jù)這個(gè)信息到binlog中查找更改正確內(nèi)容對(duì)應(yīng)的update語(yǔ)句.
MYSQL教程
MYSQL教程
MYSQL教程上面的binlog日志顯示這個(gè)sql將原來(lái)數(shù)據(jù)庫(kù)中正確的內(nèi)容,更新成一堆亂碼.所以導(dǎo)致數(shù)據(jù)庫(kù)中的存儲(chǔ)數(shù)據(jù)亂碼.
MYSQL教程從binlog日志可以看出在更新時(shí),是用latin1的方式寫入到數(shù)據(jù)庫(kù)中.Update后面的set語(yǔ)句中item_title字段的內(nèi)容是亂碼的,所以確認(rèn)是導(dǎo)入數(shù)據(jù)源本身內(nèi)容有問(wèn)題,從而導(dǎo)致更新后的數(shù)據(jù)亂碼.跟用戶確認(rèn)這個(gè)update語(yǔ)句的更新內(nèi)容,是先從庫(kù)中l(wèi)oad 出來(lái),后拼接成的update sql,所以懷疑load出來(lái)的數(shù)據(jù)就已經(jīng)是亂碼了,然后直接用這個(gè)錯(cuò)誤的數(shù)據(jù)更新原來(lái)正確的數(shù)據(jù),導(dǎo)致所有的正確的數(shù)據(jù)亂碼.所以,需要確認(rèn)這個(gè)update導(dǎo)入的數(shù)據(jù)源是否正確,即load出來(lái)的數(shù)據(jù)是否是正確的.
MYSQL教程2>???? 導(dǎo)入數(shù)據(jù)源確認(rèn)
MYSQL教程開啟實(shí)例的全日志開關(guān),然后比對(duì)日志,從上面update語(yǔ)句對(duì)應(yīng)的連接運(yùn)行的sql中查找數(shù)據(jù)導(dǎo)出語(yǔ)句,以及對(duì)應(yīng)的字符集設(shè)置.
MYSQL教程
MYSQL教程從上面的日志內(nèi)容可以看出,這個(gè)連接建立后沒有進(jìn)行任何字符集的設(shè)置,直接從數(shù)據(jù)庫(kù)中將內(nèi)容select出來(lái).在mysql中,如果沒有設(shè)置session級(jí)別的字符集,那么使用默認(rèn)的配置,配置如下:
MYSQL教程
MYSQL教程即輸出會(huì)按照l(shuí)atin1的格式顯示.在默認(rèn)字符集的配置下,手動(dòng)運(yùn)行SELECT `main_table`.* FROM `promo_item` AS `main_table` WHERE? promo_item_id ='500186324' 命令,可以發(fā)現(xiàn),在character_set_results 設(shè)置為latin1的情況下,輸出結(jié)果中的item_title確實(shí)為一堆問(wèn)號(hào).
MYSQL教程
MYSQL教程由于latin1不能正確表示中文字符,所以顯示為一堆問(wèn)號(hào),用戶直接將這個(gè)內(nèi)容update 原來(lái)正確的內(nèi)容,所以導(dǎo)致存儲(chǔ)內(nèi)容亂碼.
MYSQL教程(3)小結(jié)
MYSQL教程在使用mysql存儲(chǔ)中文字符時(shí),需要注意以下幾點(diǎn):
MYSQL教程1>???? 確認(rèn)更新的數(shù)據(jù)源同mysql 的session級(jí)別的字符集保持一致,Session級(jí)別的字符集可以用set names charset_name來(lái)設(shè)置.
MYSQL教程2>???? 如果要正確顯示中文,需要將character_set_results設(shè)置為GBK或是utf8.同時(shí),客戶端的顯示字符集需要跟character_set_results的配置一致.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/3822.html