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)
mysql文档手机版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字节的汉字;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论