暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL utf8mb4字符集在云上的使用

小小亮 2021-08-12
874

背景

百度云创建实例时默认字符集为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.pngimage.png

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

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

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

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


最后修改时间:2021-08-12 14:31:17
文章转载自小小亮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论