首页 > MySQL > 关于 MySQL 中 utf8 的问题

关于 MySQL 中 utf8 的问题

有一个段子,我每次看了都头皮发麻,这个段子是:

手持两把锟斤拷,口中疾呼烫烫烫,脚踏千朵屯屯屯,笑看万物锘锘锘

我相信凡是和我有一样感觉的应该都知道这是啥,所以为了避免这个问题,我们工作的建议就是,所有的地方都设置成:UTF-8,确实我们这样工作了很多年,不知道哪一年 emoji 突然火了,于是在上家公司做论坛的时候,有一个小伙伴遇到了类似于下面的一个小问题(我找不到原报错日志了):


Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1

当时问我,我也不知道原因,然后经过一番搜索之后,发现原来是 MySQL 存储 emoji 时出错了,存储 emoji 的时候,不应该用 utf8,而是用 utf8mb4。

随着移动互联网的到来,emoji 的应用越来越广泛,本以为这个问题大家都知道了,所以就没有深究过,想着自己记着就行了,但是不知道为什么最近这个问题突然火了,原来不是所有人都知道这个问题,甚至有人说,在做微信开发的时候,天知道微信用户会取什么昵称,所以不得已把用户的昵称都 base64 编码一下,展示的时候再解码,我只能表示:厉害,人民群众的智慧是无穷的。

其实产生这个问题的原因也很简单,据说是 MySQL 的一个 bug:

1. MySQL 的 utf8mb4 是真正的utf8。
2. MySQL 的 utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。

关于什么是编码,我相信大家应该都知道了,如果不知道请自行搜索(当年曾经给一个计算机在读博的学姐科普什么是 GBK、GB2312、GB18030、UTF-8、BIG5、ISO-8859-1 等等,也是心累),至于为什么 MySQL 的 utf8 不是真正的 utf8,这是一个历史原因,我搜索的资料是:MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,而今天使用的 UTF-8 标准(RFC 3629)是随后才出现的。

所以现在我们看到的很多 MySQL(或者 MySQL 的分支:MariaDB)资料依然在建议,MySQL 的编码使用 utf8,这在绝大多数的情况下,确实也没有问题,但确实是错误的,最好的选择是,选用真正的 utf8,也就是:utf8mb4。对于已经选用 utf8 需要改用 utf8mb4 的项目,这有一个指南:

https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

另,我们有时候会看到:UTF-8、utf-8 和 utf8 三种写法,其实标准的写法应该是:UTF-8,但因为 Windows 不区分大小写,所以有时候有人会写成:utf-8,也会被识别,但这是不标准的;至于 utf8,则是因为:MySQL 的命令模式中只能使用 utf8,不能使用 utf-8,所以又是 MySQL 的一个坑。所以我很想说的是,什么是经验?经验就是踩过了无数的坑,坑连成片,也就没有坑了,这就是经验,这就是老程序员存在的意义。

参考资料:
https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434
这是一个老外两年前写的文章,不知道为啥好像突然被国人发现了新大陆是的,具体大家也可以看看这篇文章,写的很详细。

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/565
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: MySQL 标签: , ,
  1. 本文目前尚无任何评论.

请输入正确的验证码