• 【原创】通俗易懂地解决中文乱码问题(2) 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0... Roly


    这篇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

  • 相关阅读:
    反射&异常
    成员方法
    继承&多态
    面向对象
    常用模块
    软件目录结构规范
    内置函数
    生产器&迭代器
    装饰器
    函数
  • 原文地址:https://www.cnblogs.com/xiaoboCSer/p/4175861.html
Copyright © 2020-2023  润新知