请不要再在 MySQL、Mariadb 中使用 "utf8" ,要采用 "utf8mb4"

学习笔记 马富天 2020-01-17 15:24:41 5 0

【摘要】以前知道 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",但这是错误的。

问题复现:

  1. mysql> CREATE TABLE `test` (
  2.   `name` varchar(255) DEFAULT NULL
  3. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  4. Query OK, 0 rows affected
  5. mysql> insert into test values('😉');
  6. mysql> select * from test;
  7. +------+
  8. | name |
  9. +------+
  10. | ?    |
  11. +------+

因为 test 表是 utf8 编码,只支持最多 3 个字节的 unicode 范围,而 emoji 字符属于 4 字节编码部分,所以执行无法识别该 emoji 表情。

解决办法:修改表字符集编码并修对应字段的字符集编码,如下:

  1. mysql> alter table `test` default charset utf8mb4;
  2. mysql> alter table test modify name varchar(255) character set utf8mb4 default null;
  3. mysql> insert into test values('😉');
  4. mysql> select * from test;
  5. +------+
  6. | name |
  7. +------+
  8. | ?    |
  9. | 😉   |
  10. +------+

这样 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

  1. set names utf8mb4;

最后:utf8mb4 是 utf8 的超集,并完全兼容 utf8。

版权归 马富天PHP博客 所有

本文标题:《请不要再在 MySQL、Mariadb 中使用 "utf8" ,要采用 "utf8mb4"》

本文链接地址:http://www.numberer.net/434.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

1

0

上一篇《 浅谈 mysql 整型类型简介(tinyint,smallint,mediumint,int,bigint) 》 下一篇《 什么是 MySQL 的排序规则(Collation)? 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多