字符集
在 MySQL 中直接存储表情的时候,会出现无法插入数据的错误。 这是由于一般情况下,MySQL 的字符集是 utf8,而对于 emoji 表情的 mysql 的 utf8 字符集是不支持,需要修改设置为 utf8mb4 才行。 摘引: mysql utf8mb4与emoji表情 MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区( BMP是从哪到哪 ),基本就是0000~FFFF这一区。 从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。 utf8mb4 is a superset of utf8 ,utf8mb4兼容utf8,且比utf8能表示更多的字符
存储表情报如下错误
Error 1366: Incorrect string value: '\\xF0\\x9F\\x98\\x8E</...' for column 'sn_content' at row 1
这个问题是由于数据库的编码方式引起的,首先我们来了解一下utf8和utf8mb4的区别:
utf8一般是指UTF-8,是针对Unicode的一种可变长度字符编码,每个字符最多三个字节,有时候也称为utf8mb3。
utf8mb4是utf8的超集,mb4就是most bytes 4的意思,专门用来兼容四字节的Unicode,MySQL在5.5.3之后增加了utf8mb4的编码。
MySQL支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会插入异常了。三个字节的utf8最大能编码的Unicode字符是0xffff,任何不在基本多文本平面的Unicode字符,都无法使用MySQL的utf8字符集存储,包括emoji表情和很多不常见的汉字,以及任何新增的Unicode字符等。如果要在MySQL中保存4字节长度的utf8字符,需要使用utf8mb4字符集。
由以上可以看出,要想存储表情包,那么数据库的编码方式需要是utf8mb4的,那么现在我们查找游戏数据库编码配置:
show variables like 'character_set_database';
截图如下:
根据错误修改数据库、数据表字符集及表字段字符编码, 如下:
datebase charset=utf8mb4
datebase collation=utf8mb4_unicode_ci
character set=utf8mb4
collation=utf8mb4_unicode_ci
Charset=utf8mb4
Collation=utf8mb4_unicode_ci
例如:
ALTER TABLE `test`
CHANGE COLUMN `content` `content` TEXT CHARACTER SET 'utf8mb4' NOT NULL COMMENT '内容';
接下来在前端富文本框中选择表情存储,如下:
然后尝试存储,发现还是不行,报以下错误:
{"code":500,"msg":"Error 3988: Conversion from collation utf8_general_ci into utf8mb4_unicode_ci impossible for parameter","data":null}
经过检查, 要将content属性类型有text变为blob即可,记得修改mysql的配置文件my.conf
[client]
# 客户端来源数据的默认字符集
default-character-set = utf8mb4
[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4
# 连接层默认字符集
collation-server=utf8mb4_unicode_ci
[mysql]
# 数据库默认字符集
default-character-set = utf8mb4
修改完毕后,记得重新启动mysql服务
总结
数据库和数据表建议用utf8mb4,如果项目中有存储表情包的需求,则推荐用blob类型存储,以上是我项目存储表情遇到的问题,在此,仅用于记录。