Emoji,这些可以表达情感的小卡通图像已经成为现代交流中不可或缺的一部分,以致于emoji这一单词已经在2015年被正式收入韦氏词典和牛津词典。说到emoji的诞生,这里还有一个颇有趣的小故事:
1999年先后,日本一个名叫栗田穰崇的年轻人,和许多直男同样, 给女朋友发的短信常常会被误解。好比,“知道了”被解读成“生气了”、“不耐烦了”,随后引起冷战。 因而少年栗田想:“若是能在文字里插入一些表情符号来表达感情,你们应该会须要吧!”
原始的Emoji就这么诞生了
emoji 愈来愈流行,一个emoji 表情,有时赛过千言万语。尤为在移动端,不少用户喜欢把emoji 表情作为本身用户名称的一部分,例如微信中,就有不少朋友的用户名是这样的,以下:java
这确实很好看,但这却给咱们的应用程序带来了必定的问题。目前咱们就碰到了一个由于用户名称中带有emoji 表情,致使数据没法存储的状况。
事情是这样的,咱们的系统使用的数据库是MySQL,版本是5.5.31,最近咱们发现咱们的程序有很多报错,报错显示是有一些用户的数据没法保存,经过对报错日志分析,最终定位到是由于用户名中带有emoji 表情,致使数据存储失败。为何会会数据会保存不了emoji表情呢?这里就牵涉到一个emoji的编码问题。mysql
Emoji字符是Unicode字符集中一部分.
常见的Emoji表情符号在Unicode字符集中的范围和具体的字节映射关系, 能够在Emoji Unicode Tables中查看到.
有意思的是, 该表中还给出了同一个Emoji表情在不一样系统或应用中的字体(是字体没错, Emoji的样式可经过字体文件改变)。sql
关于Emoji的最权威资料, 能够在Unicode® Emoji Charts上查阅到.
咱们的MySQL是使用的utf8编码,可是由于UTF-8编码有多是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,因此致使了数据插不进去。因此为了让MySQL支持emoji表情的存储,必需要使用utf8mb4 编码。
utf8mb4做为utf8的super set,彻底向下兼容,因此不用担忧字符的兼容性问题。切换中须要顾虑的主要影响是mysql须要从新启动。数据库
在升级前须要肯定几件事情:
一、MySQL的版本。MySQL的版本必须为5.5.3以上的版本,若是不是须要先升级MySQL,由于以前的版本不支持utf8mb4
二、若是你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,不然仍然没法使用utf8mb4 。其它语言的暂不清楚。服务器
mysql 修改的操做步骤须要修改如下几个地方:
一、修改mysql配置文件my.cnf
my.cnf通常在/etc/mysql/my.cnf位置。找到后请在如下三部分里添加以下内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'微信
二、修改database、table字符集。参考如下语句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;字体
三、重启mysql编码
四、检查字符集日志
character_set_system 的值是utf8没有关系,并且这个值不能改成utf8mb4,不然mysql 会启动不了。code
好了,到此,数据就能够支持存储emoji 表情数据了。
总结:一、因为目前移动互联网发展迅猛,而且emoji 愈来愈流行,因此为了不在业务使用中升级MySQL字符集,最好是在部署MySQL的时候,就默认设置MySQL 支持 utf8mb4,由于utf8mb4是utf8的超集,是向下兼容,因此也不会影响utf8字符集的使用。二、程序开发的时候,建库建表语句最好也指定库表的字符为 utf8mb4。三、若是是已经在线的业务,而又不能重启MySQL的状况下,也能够经过应用层面转换emoji等特殊字符,以达到原数据兼容,在获取的时候,能够加一个标签注明,是否使用了emoji,这样取数据时,就再作转换就可。