博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】以前知道 mysql 中有 utf8mb4 这种编码,但是没有去了解 utf8mb4 和 utf8 的区别,后来才知道这二者的区别,所以本文用来告诫自己不要再在 MySQL、Mariadb 中使用 "utf8" 编码了。
首先简单介绍 utf-8 编码:utf8 是针对 Unicode 的一种可变长度字符编码,UTF-8 使用 1~4 字节为每个字符编码。
MySQL 遗留问题:
MySQL 4.1 版本开始支持 utf-8 编码(2003年),但此时的 utf8 只能最多支持 3 个字节,而完整的 utf-8 编码是最多能支持 4 个字节的,此时 utf8 的别名为 utf8mb3。在 2010 年 MySQL 的开发者增加了一个新的字符集用来解决 utf8 的 bug ,这个编码就是 "utf8mb4",要求 mysql 版本 5.5.3 及以上,然而开发者并没有对新的字符集进行广而告之,以致于网络上仍然建议开发者使用 "utf8",但这是错误的。
问题复现:
mysql> CREATE TABLE `test` (
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected
mysql> insert into test values('😉');
mysql> select * from test;
+------+
| name |
+------+
| ? |
+------+
因为 test 表是 utf8 编码,只支持最多 3 个字节的 unicode 范围,而 emoji 字符属于 4 字节编码部分,所以执行无法识别该 emoji 表情。
解决办法:修改表字符集编码并修对应字段的字符集编码,如下:
mysql> alter table `test` default charset utf8mb4;
mysql> alter table test modify name varchar(255) character set utf8mb4 default null;
mysql> insert into test values('😉');
mysql> select * from test;
+------+
| name |
+------+
| ? |
| 😉 |
+------+
这样 emoji 表情等等四字节的字符就可以正常插入到 mysql 中啦~
当然如果开发者使用 pythonphp 语言连接 MySQL 的话,也一定需要将连接字符集设置成 "utf8mb4",这样可以插入。
问题总结:目前的 mysql 中 utf8 编码(utf8mb3)不是真正完整的 utf-8 编码,真正完整的是 utf8mb4 字符集编码,而 utf8mb4 是兼容 utf8mb3 的,所以要使用 utf8mb4 编码集,不要再使用 utf8mb3 啦!
小备注:
创建数据库并设置编码:
create database <数据库名> default utf8mb4;
修改数据库编码格式:
alter database <数据库名> character set utf8mb4;
修改表编码格式:
alter table <表名> character set utf8mb4;
alter table blog_article character set utf8mb4;
修改字段编码格式:
alter table <表名> change <字段名> <字段名> <类型> character set utf8mb4;
查看 mysql 编码格式:
show variables like 'char%';
其实在很久之前就发布过一篇相似的问题,本文就当做温故而知新啦~
http://mafutian.numberer.net/369.html后期添加的内容:
以上解决办法中需要设置连接字符集为 utf8mb4
set names utf8mb4;
最后:utf8mb4 是 utf8 的超集,并完全兼容 utf8。
版权归 马富天个人博客 所有
本文标题:《请不要再在 MySQL、Mariadb 中使用 "utf8" ,要采用 "utf8mb4"》
本文链接地址:http://www.mafutian.com/434.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶1
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||