Emoji表情字符已经是当下网络交流的标配了,如果你也想让你的网站或者App支持Emoji,那么在选择用Mysql作为后端存储时就需要格外注意一下了。
问题
一般情况下,在使用Mysql时候我们会选择UTF8这种字符,不过这种变长字符只支持存储1~3个字节的字符,而Emoji表情字符却是用4个字节来表示一个字符的。这样当你往数据库中写入带有emoji字符数据时会抛出异常,无法正确存储。
解决方案
如果是新项目,只要在建表的时候把字符编码集注意更换成支持4字节字符的utf8mb4就可以了。Mysql在5.5.3之后就支持utf8mb4这种字符集了。
另一种情况是,在遗留项目上做修改,这种情况稍微麻烦一些,还需要你对老数据做兼容,针对这种场景也有两个处理方案
方法一:
对要存储的文本在存储之前进行Base64编码,这样就不存在真正意义上的emoji了,不过繁琐的地方是在读取的时候还要进行相应的解码。这个可以在ORM层通过Hook来实现,算是个不错的变通方案。
方法二:
与方法一的扬汤止沸不同,方法二通过直接修改Mysql现有字符集为utf8mb4更像是釜底抽薪。修改编辑my.conf配置文件:
[client]
default-character-set = utf8mb4
[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
重启后,进入Mysql终端,执行show variables like 'char%';查看当前数据库字符集,同时为了兼容旧数据,还修改旧表的编码字符集为utf8mb4
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
这样就差不多了,不过其实还是有一些问题的比如索引长度767的限制,mysqldump默认字符集的问题,以及一些与ORM相关的读取写入问题,留在下篇写吧。
-待续-
你还可以看:
参考引用