云数据库RDS

    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字符集。

    解决方案

    1. 首先,库、表、字段级别要支持utf8mb4字符集:

    (1)修改库级别字符集:

    alter table tb_01 character set utf8mb4 ;

    (2)修改表级别字符集:

    alter table tb_01 default character set utf8mb4 ;

    表级别修改字符集前后checksum表数值一致:

    image.png image.png

    (3)修改字段级别字符集:

    alter table tb_01 change column1 column1 varchar(50) character set utf8mb4;

    字段级别修改字符集前后checksum表数值一致: image.png image.png

    1. 如果客户想要准确的写入并读取utf8mb4字符集字符,还需要:

    (1)客户创建连接时指定utf8mb4字符集:

    set names utf8mb4;

    (2) 修改MySQL数据库存储的字符集:

    修改 character-set-server = utf8mb4,default-character-set = utf8mb4后。这两个参数需要对MySQL实例重启生效。

    结论建议

    1. RDS创建初期定义好合适的数据库字符集、表字符集和字段字符集是非常值得提倡的习惯。
    2. 如果业务某个表使用到每个字符大于3个字节的数据(例如emoji表情符号),建议该表直接选用utf8mb4字符集。
    上一篇
    MySQL5.7新特性之GeneratedColumn
    下一篇
    mysqldump工具使用详解