emoji引发的MySQL运维事件

竞考网自从接入了微信登录后,发现后台总是会爆插入错误:

Incorrect string value: ‘\xF0\x9F\x98\x83 …’ for column ‘user’ at row 1

原因

查了MySQL的手册才发现,原来MySQL内置的utf8设计是每个字符最大三字节,遇到emoji这种需要四字节的就会报错。

MySQL提供了utf8mb4字符集来修复这个问题,文档链接: https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html

疑问

最大的疑问在于:utf8mb4相比起utf8,在文件体积上会不会大很多。

为此,我做了测试,往两个仅字符集不同的表插入大量的数据:

# 查看表物理文件占用的大小
[sudocn@test /data/mysql ]
# ll *.ibd
-rw-r----- 1 root root 1098907648 May  7 10:26 t1.ibd
-rw-r----- 1 root root 1098907648 May  7 10:29 t2.ibd

两张表实际占用空间是完完全全一样的,我就放心了。

解决

直接用alter语句修改数据库、表以及字段的字符集即可:

#数据库
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
#表
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
#字段
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;