昨天在移动端接口开发中,开发人员反馈,往接口传值中包含手机输入法中的emoji表情时,app就直接挂掉。查找原因,发现在往数据库插入数据时,报错 Incorrect string value: '\xF0\x9F\x92\xAA",...' for column 'content' at row 1。
既然知道了问题,马上去引擎中搜索解决方案。以下给你普及一些知识:
一.
插入的字段里面包含emoji表情符。基本可以判定是字符编码的问题。我们的数据库里面使用的是utf8编码,普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点。
utf8与utf8mb4说明:
UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
二.ALTER TABLE cnfol_dynamic MODIFY COLUMN content text CHARACTER SET utf8mb4;(修改表字段的字符集)
改完后测试,插入失败。
; (修改表的字符集)
[size=+0]
改完后测试,插入失败。
ALTER DATABASE caishi CHARACTER SET utf8mb4; (修改库的字符集)
改完后测试,插入失败。
最后尝试修改mysql配置文件my.cnf
vi /etc/my.cnf
在[client]下添加
default-character-set=utf8mb4
在[mysqld]下添加
default-character-set=utf8mb4
修改完测试,依旧报错。
最终查找原因,在php代码连接数据库的时候,有个设置字符集的选项。这个选项也应该设置成utf8mb4。
以上全部修改成功后,测试可行。而且不影响原来的数据。utf8mb4是完全兼容utf8的。