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;