关于 MySQL 中 utf8 的问题

栏目: 数据库 · Mysql · 发布时间: 6年前

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

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

我相信凡是和我有一样感觉的应该都知道这是啥,所以为了避免这个问题,我们工作的建议就是,所有的地方都设置成: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

原文链接: https://www.bridgeli.cn/archives/565

版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。


以上所述就是小编给大家介绍的《关于 MySQL 中 utf8 的问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

科技之巅2

科技之巅2

麻省理工科技评论 / 人民邮电出版社 / 2017-6-1 / CNY 88.00

《麻省理工科技评论》从2001年开始,每年都会公布“10大全球突破性技术”,即TR10(Technology Review 10),并预测其大规模商业化的潜力,以及对人类生活和社会的重大影响。 这些技术代表了当前世界科技的发展前沿和未来发展方向,集中反映了近年来世界科技发展的新特点和新趋势,将引领面向未来的研究方向。其中许多技术已经走向市场,主导着产业技术的发展,极大地推动了经济社会发展和科技创新......一起来看看 《科技之巅2》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具