升级mysql字符集到utf8mb4以支持4位字节的字符

1. utf8字符集不能保存emoji表情

我们生产环境mysql全部用的是utf8字符集,但是,遇到emoji表情的时候这个字符集弱爆了。现在项目中保存emoji表情,插入报错了,如下

Incorrect string value: '\xF0\x9F\x98\x9C</...' for column 'name' at row 1

这插入的是一个微笑的表情,占4个字节。而我们知道,mysql的utf8字符集最长是3个字节。很显然,是保存不进去的,那么问题就来了。

2. 如何让mysql保存emoji表情

网上搜索发现,解决办法还是不少的,有转为UBB代码的,如[emoji]----[/emoji];也有进行html转义的&#x----; (----表示unicode数值)转义的。这两种办法都需要我们的程序端做大量的工作,显然不太可取,最好的办法就是数据库可以保存4字节长度的字符。

mysql5.5.3之后新增了utf8mb4字符集,这个字符集最长支持4字节的字符。

对于3字节以内的字符,utf8mb4utf8有着相同的代码值,相同的编码和相同的长度,意味着它完全兼容utf8字符集

3. 将utf8升级到utf8mb4

得益于utf8mb4utf8完整兼容,我们可以在不改动现有应用的情况下,平滑升级字符集以支持存储emoji表情。

3.1 直接修改表结构

修改数据库字符集

1
ALTER DATABASE test CHARACTER SET = utf8mb4;

修改表字符集

1
alter table test convert to character set utf8mb4;

修改字符字符集

1
ALTER TABLE `test` CHANGE COLUMN `name` `name` varchar(12) CHARACTER SET utf8mb4;

3.2 修改数据库默认配置

在对应位置添加如下配置

1
2
3
4
5
6
7
8
9
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4

P.S. 如果你使用的是java语言,需要将jdbc驱动包升级到 mysql-connector-java-5.1.14.jar。


参考:

Mysql支持emoji 表情符号 升级编码为UTF8MB4

MySQL保存emoji