出现这个问题主要还是MySQL编码的问题。
首先要知道,MySQL的UTF-8格式分为N种,有UTF-8,UTF-16,UTF-8又分为基础utf8,utf8mb3,utf8mb4,其中utf8mb4才是4个字节的支持emoji表情的正确编码格式。
所以解决方案:
旧表升级:
你需要把表和字段进行编码转换,执行下面代码(注意修改里面的表名和字段名):
ALTER TABLE t1 DEFAULT CHARACTER SET utf8mb4, MODIFY col1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, MODIFY col2 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
这样能够无错的把旧表转换成支持emoji表情的utf8mb4编码
新表:
建数据库,建表时记得选择格式为utf8mb4格式即可。
为什么会这样:
这里顺带说下为什么utf8mb4才可以保存emoji表情和其他生僻字的原因:
utf8mb4为一个4字节字符存储方式,emoji表情是需要4个字节以上保存空间的,因为他的编码值范围比较大。3个字节无法保存。而默认的utf8和utf8mb3都是3字节的存储空间,所以他们虽然为utf8格式,但是并不能正常保存emoji表情。
对于MySQL各种编码的具体说明可以参考下表:
官方文档介绍:
https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html