· MySQL不能存储emoji的原因
标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符,这几乎包含了是世界上所有能看见的字符了。
然而,在MySQL里实现的utf8最长使用3个字节,只支持 Unicode 中U 0000至U FFFF的字符,包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但是emoji表情和一些不常用的汉字,如 “𪚥” (四个龍组成的汉字,Unicode:0002A6A5,UTF-8:F0AA9AA5),这些在utf8中需要四个字节才能编码的字符,就无法存储。
因此,MySQL在 5.5.3 之后增加了utf8mb4 字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。
MySQL 在 8.0 开始使用 utf8mb4 作为 MySQL 的默认字符集。
· 解决方法
1. 备份数据库(一定要先备份数据,数据无价);
2. 确保MySQL版本大于 5.5.3,低于5.5.3的请升级版本;
查看方法,执行以下SQL命令,看返回结果:
select version();
3. 修改服务器上MySQL的默认编码,修改数据库、表、列的字符集为utf8mb4
ALTER DATABASE [数据库名称] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE [表名] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
示例(数据库名我用zbase示范了,大家根据自己的实际修改;表名我用默认的zbp_的前缀来进行操作,修改前缀的请根据你实际的表名操作):
ALTER DATABASE zbase CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE zbp_post CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE zbp_comment CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
通过以下SQL查询,可以检查utf8mb4是否生效。
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
如上图所示,即为修改成功了。
MySQL 就可以支持emoji表情的存储,ZBlog也就可以显示和存储emoji了。