mysql保存生僻字特殊字符(utf8mb4)

探讨MySQL数据库在保存生僻字及Emoji表情时遇到的问题,解析utf8与utf8mb4字符集的区别,提供解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库编码是utf-8,保存生僻字或emoji时异常,无法保存;

执行:INSERT INTO leave_record VALUES (102,“?”,NULL ,NULL,NULL,NULL,NULL);

结果:[HY000][1366] Incorrect string value: ‘\xF0\xA4\x8B\xAE’ for column ‘user_id’ at row 1
Details
从错误信息中可以看出,"?"占用了4个字节,而emoji表情也是4个字节;而正常插入的字符则占用3个字节,所以utf-8只支持3字节;

官方文档:

10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)
The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplemental characters:

For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.
For a supplementary character, utf8 cannot store the character at all, while utf8mb4 requires four bytes to store it. Since utf8 cannot store the character at all, you do not have any supplementary characters in utf8 columns and you need not worry about converting characters or losing data when upgrading utf8 data from older versions of MySQL.
utf8mb4 is a superset of utf8.
由官方文档可知,mysql 支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)

查看和修改字符集的常用命令:

查看一下数据库的字符集情况: show variables like ‘%character%’;
mysql的字符集的作用域有三个层级一个数据库级,一个是表级,一个是列级(字段级别的)。

优先级是:列级》表级》数据库级。从优先级知道如果存emoji的那个字段不是utf8mb4字符集,那么即使数据库是utf8mb4也是无济于事的。

查看保存emoji的字段的字符集,如果字段的字符集不对,则修改为utf8mb4

show full columns from admin;
alter table admin modify user_name varchar(100) charset utf8mb4;

对于mysql字符集我们不想出现乱码情况有一个经验就是character_set_client、character_set_connection、character_set_results字符尽量设置成一致的。

set names utf8mb4

这条语句等同于对上面三个参数的配置成utf8mb4。在插入和查询emoji字符的时候,不要忘了在前面加上这个语句,以防止出现乱码。

还有一个Char 和Varchar的逻辑,比如varchar(10),其真实范围其实是10-30个字节,因为既可以保存10个英文,也可以保存10个3字节的汉字;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值