你在MySQL中使用UTF-8吗?如果是那就麻烦了!

你在MySQL中使用UTF-8吗?如果是那就麻烦了!

总结:

utf8mb4 才是真正的UTF-8

是的,MySQL 的“utf8mb4”才是真正的“UTF-8”。

MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。

**在这里 Mark 一下:**所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。

记得上个月我在往 MySQL 存入 emoji 😲😳表情时,一直出错,无法导入。后来找到办法,通过把 utf8 改成 utf8mb4 就可以了,当时并没有深究。

一年后,我看到一篇文章讲到 emoji 文字占 4 个字节,通常要用 utf-8 去接收才行,其他编码可能会出错。

我突然想到去年操作 MySQL 把 utf8 改成 utf8mb4 的事儿。

嗯?他本身不就是 utf8 编码么!那我当时还改个锤子?难道,MySQL 的 utf8 不是真正的 UTF-8 编码吗??! 卧槽,这 MySQL 有 Bug!

带着疑问查询了很多相关材料,才发现这竟然是 MySQL 的一个历史遗留问题。我笑了,没想到这么牛 B 的 MySQL 也会有这段往事。

###报错回顾:

这也分数据库版本,首先来看mysql :5.5

将 emoji 文字直接写入 SQL 中,执行 insert 语句没有报错:

INSERT INTO `user` VALUES(null,"水巷石子😓","2020-9-26",'1',"郴州"); 

在这里插入图片描述

但查看的时候,却变成了?号

在这里插入图片描述

改了数据库编码、系统编码以及表字段的编码格式→utf8mb4 之后还是一样,就可以了:
在这里插入图片描述

在这里插入图片描述

再来看mysql :latest(8.0+)版本

将 emoji 文字直接写入 SQL 中,执行 insert 语句报错:

INSERT INTO `user` VALUES(null,"水巷石子😓","2020-9-26",'1',"郴州"); 

1366 - Incorrect string value: ‘\xF0\x9F\x98\x93\xF0\x9F…’ for column ‘username’ at row 1

改了数据库编码、系统编码以及表字段的编码格式→utf8mb4 之后,就可以了:

INSERT INTO `user` VALUES(null,"水巷石子😓","2020-9-26",'1',"郴州"); 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mysql中的趣事:

MySQL 的“utf8”实际上不是真正的 UTF-8。

在 MySQL 中,“utf8”编码只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

在 utf8 编码中,中文是占 3 个字节,其他数字、英文、符号占一个字节。

但 emoji 符号占 4 个字节,一些较复杂的文字、繁体字也是 4 个字节。所以导致写入失败,应该改成 utf8mb4。

MySQL 一直没有修复这个 Bug,他们在 2010 年发布了一个叫作“utf8mb4”的字符集,巧妙的绕过了这个问题。

当然,他们并没有对新的字符集广而告之(可能是因为这个 Bug 让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页