Mysql 支持 Emoji 表情、兼容四字节的unicode

原创 经验总结
阅读数: 410 2017年09月12日

最近经常有客户反馈,微信网页授权后页面报错,因为线上环境关闭了DEBUG,也无法在页面上看到具体什么错误,只能根据时间点去翻日志。


发现这错误:

ERR: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x90\xB5\xF0\x9F...' for column 'nickname' at row 1


问过了度娘,都是说不支持特殊字符、编码问题什么的,反正没一个解决方案,好怀念谷歌。


其中有一个回答提到了 Emoji 表情,我忽然想起我之前看到的一篇关于 Mysql 编码区别介绍的文章,其中介绍到 utf-8 和 utf8mb4 的区别,里面谈到过 utf8mb4 可以支持 Emoji 表情和四个字节的 unicode,而utf-8 只能支持三个字节字符。


特意找了个Emoji 表情(💁李安咏💆),复制后放入之前的表保存,出现的错误和日志的一样。运气不错,一下就找到问题。


MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。


一般情况下都是使用 utf8 就够了,也可以节省空间。


问题找到,直接修改 nickname 的编码(排序规则)即可。然后再把 Emoji 复制进去,可以保存了,不会报错了。然后按步骤修复问题,测试,上线。


phpriji.cn | 网站地图 | 沪ICP备17015433号-1