码农日记

薄洪涛的个人博客

摘抄--别在MySQL中使用UTF-8

直接看复现过程

insert into user (id,name,sex) values (1,'机智如我','男')

[Err] 1366 - Incorrect string value: '\xF0\x9F\x98\x93' for column 'NAME' at row 1

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

原因:

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

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

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

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

 正因如此,4 字节的内容往 utf8 编码中插入,肯定是不行的,插不进去

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

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

utf8mb4 才是真正的UTF-8

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

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

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


总结

主要是目前网络上几乎所有的文章都把 “utf8” 当成是真正的 UTF-8,包括之前我写的文章以及做的项目(捂脸);因此希望更多的朋友能够看到这篇文章。

相信还有很多跟我在同一条船上的人,这是必然的。

所以,大家以后再搭建 MySQL、MariaDB 数据库时,记得将数据库相应编码都改为 utf8mb4。

终有一天,接你班儿的程序员发或你的领导现这个问题后,一定会在心里默默感到你的技术牛 B。

查看原文

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处