通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......
這篇blog重點(diǎn)在解決問題,如果你對(duì)字符編碼并不是特別了解,建議先看看 《 【原創(chuàng)】通俗易懂地解決中文亂碼問題(1) --- 跨平臺(tái)亂碼 》。
當(dāng)然,如果只是針對(duì)解決這個(gè)Mysql插入報(bào)錯(cuò)問題,本篇足夠了。
?
一、定位錯(cuò)誤
?
定位錯(cuò)誤絕對(duì)是至關(guān)重要的一環(huán)。我建議遇到問題耐心分析一下比較好,畢竟“不是所有的牛奶都叫特侖蘇”。
引起同一個(gè)問題的可能有很多,別人的解決方案也許并不適合自己。
那先看看問題出現(xiàn)在哪了,報(bào)錯(cuò)如下:
發(fā)現(xiàn)的確是編碼錯(cuò)誤, 16進(jìn)制的錯(cuò)誤提示(\xF0\x9F\x94\xA5\xE5\x8C...)雖然說的比較清楚了但是看看這個(gè)字段值是什么也無妨。
看看此時(shí)‘event_title’是什么鬼東西,如下:
原來是有一個(gè)特殊字符'?‘。這個(gè)字符的來源是移動(dòng)端,現(xiàn)在大家聊天不加個(gè)表情賣萌還能不能做朋友了?所以移動(dòng)端大量的新興字符確實(shí)對(duì)數(shù)據(jù)庫有了更改的要求。
?
那么再一探究竟,看看這個(gè)字符的二進(jìn)制是什么?如下(第一行):
到這我們基本可以定位這個(gè)問題的原因了。
1、這個(gè)字符占用三個(gè)字節(jié)。
2、根據(jù)上一篇對(duì)UTF-8編碼方式的介紹,我們知道對(duì)于UTF-8三個(gè)字節(jié)的編碼,其格式是 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz。但是這個(gè)特殊字符低8位竟然是1111,顯然不符合utf-8編碼規(guī)則,所以mysql不支持寫入。(其實(shí)這和最開始的錯(cuò)誤提示是一致的)
?
二、解決問題
?
問題定位了那么就該想辦法解決了,目前無非兩條路可選。
1、哎您厲害我怕了還不成嗎,所以煩勞您別入庫了。因此對(duì)應(yīng)的解決辦法就是入庫前把錯(cuò)亂字符刪除。
2、擦老子武功天下第一,必須見一對(duì)拆一對(duì)。因此對(duì)于的辦法就是找找看哪個(gè)Mysql的版本能支持了,更新下Mysql的版本。
生活可以任性,但是選擇還是需要認(rèn)真的。所以根據(jù)自己實(shí)際情況進(jìn)行選擇。但一般選擇2的比較少,更新數(shù)據(jù)庫版本的確是個(gè)牽扯比較多的問題。
?
解決辦法:
對(duì)于1解決辦法太多了,見仁見智了。我選擇用正則表達(dá)式來處理這個(gè)問題,因?yàn)楫吘挂膊粌H僅是這一個(gè)字符。
針對(duì)我自己的情況我使用的是 "[^,。!《》]&\\pP|\\pZ|\\pS" 這個(gè)規(guī)則匹配。
?
對(duì)于2,我查了下資料發(fā)現(xiàn)Mysql 5.6及以上版本擴(kuò)大了UTF-8的支持力度,并且添加了utf8mb4設(shè)置項(xiàng)在相應(yīng)字段上(感謝幻元素的提醒,擔(dān)心誤導(dǎo)其他人),不過通過我的實(shí)驗(yàn)并沒有解決這個(gè)問題。
也許需要在相應(yīng)字段加上 utf8_general_ci 這項(xiàng)設(shè)置。不過這項(xiàng)設(shè)置我沒有進(jìn)行測試,如果大家發(fā)現(xiàn)Mysql哪個(gè)版本和配置能解決這個(gè)問題了煩勞留個(gè)言哇~
文章最后有這個(gè)選項(xiàng)(utf8_general_ci)的一點(diǎn)說明。
?
?
附:utf8_unicode_ci和utf8_general_ci區(qū)別(引自wiki)
在數(shù)據(jù)庫系統(tǒng)MySQL中 有多種字符集,其中utf8_unicode_ci和utf8_general_ci是最常用的,但是utf8_general_ci對(duì)某些語言的支持有一些小問題,如果可以接受,那最好使用utf8_general_ci,因?yàn)樗俣瓤臁7駝t,請(qǐng)使用較為精確的utf8_unicode_ci,不過速度 會(huì)慢一些。
?
轉(zhuǎn)載請(qǐng)注明出處,謝謝~?? http://www.cnblogs.com/xiaoboCSer/p/4175861.html
?
總結(jié)
以上是生活随笔為你收集整理的通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ONOS之开放分布式SDN操作系统
- 下一篇: SQL Server事务