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

数据库编码是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字节的汉字;

你可能感兴趣的:(mysql)