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