utf8mb4字符集在云上的使用
背景
百度云创建实例时默认字符集为utf8,事实上MySQL的“utf8”字符集并不是真正的UTF-8字符集,它只支持每个字符最多三个字节,但是真正的UTF-8字符集最多可以支持四个字节;
MySQL的“utf8”字符集是一种“专属的编码”,它能够编码的Unicode字符并不多,使用该字符集存储数据有较大的局限性。
从MySQL5.5开始发布了utf8mb4字符集来支持真正的UTF-8字符集,并且utf8mb4是兼容MySQL的utf8字符集的。
问题现象
用户插入emoji表情符号是出现报错的情况,报错如下:
Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘xxxxx’ at row 1
原因分析
出现incorrect string报错是因为有些特殊字符需要使用utf8的超集utf8mb4字符集来存储,因此需要保证MySQL客户端、数据库连接、需要存储的emoji表情符号对象(库、表、字段)三者统一支持utf8mb4字符集。
解决方案
- 首先,库、表、字段级别要支持utf8mb4字符集:
(1)修改库级别字符集:alter database db_name default character set utf8mb4。
(2)修改表级别字符集:alter table tb_01 default character set utf8mb4。
表级别修改字符集前后checksum表数值一致:
(3)修改字段级别字符集:
alter table tb_01 change column1 column1 varchar(50) character set utf8mb4;
字段级别修改字符集前后checksum表数值一致:
- 如果客户想要准确的写入并读取utf8mb4字符集字符,还需要:
(1)客户创建连接时指定utf8mb4字符集:set names utf8mb4;
(2) 修改MySQL数据库存储的字符集:修改 character-set-server = utf8mb4,default-
character-set = utf8mb4后。这两个参数需要对MySQL实例重启生效。
结论建议
- RDS创建初期定义好合适的数据库字符集、表字符集和字段字符集是非常值得提倡的习惯。
- 如果业务某个表使用到每个字符大于3个字节的数据(例如emoji表情符号),建议该表直接选用utf8mb4字符集。