utf8mb4字符集在云上的使用
所有文档

          云数据库 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 database db_name default 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工具使用详解