随着移动端的兴起,越来越多的应用用户产生的内容需要支持Emoji表情,来增加趣味性。默认情况下,MySQL是不能直接插入Emoji表情的,当应用程序直接传递带表情的内容,随后就看到非法字符之类的异常了。那么,如何才能保存带有Emoji表情的内容呢?答案是将utf8编码换成utf8mb4。总共牵扯到的地方有以下:

修改MySQL的配置文件my.cnf

添加以下内容到 /path/to/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[client]
# 客户端来源数据的默认字符集
default-character-set = utf8mb4

[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4

# 连接层默认字符集
collation-server=utf8mb4_unicode_ci

[mysql]
# 数据库默认字符集
default-character-sert = utf8mb4

应用中用到的数据库指定编码集为utf8mb4

1
create database <db_name> character set utf8mb4;

应用层数据库连接适配器指定编码集为utf8mb4

例如,yii2中

1
'charset' => 'utf8mb4’,

如果应用中指定了表的编码集,那么也需要显示声明为utf8mb4

例如Yii的Migration中

1
$tableOptions = 'CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ENGINE=InnoDB';

经过上面的设置,重启MySQL后,就能顺利实现插入带Emoji表情的内容了。附一个效果图:
mysql-emoji-utf8mb4