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

薄洪涛4年前数据库1087

直接看复现过程

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。

查看原文

标签: 数据库

相关文章

GROUP_CONCAT用法

GROUP_CONCAT用法

应用场景表A有一条数据,表B有3条数据,通过  A left join B 可以展示出3条数据,如图但是我想让name在一行显示SELECT A.id, GROUP_CONCAT(B.n...

记录一次从日志中恢复mysql数据库数据

记录一次从日志中恢复mysql数据库数据

前因:有个大佬在update的时候,忘记加where条件,造成线上数据库中的某个状态值全部被修改,需要马上处理首先面对这种情况,我马上想到的就是从二进制日志文件中恢复,马上查看是否开启了日志,确定开启...

redis中的事务处理

redis事务单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令...

mysql几种常见的连接方式

mysql几种常见的连接方式

内连接(inner join)从两张表中取出所有记录做笛卡尔积;利用匹配条件进行匹配;如果内连接没有条件,那么其实就是交叉连接,这是我们应该避免的交叉连接从两张表中取出所有记录做笛卡尔积,所有的结果都...

redis查找附近的人

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。Redis GEO 操作方法有:geoadd:添加地理位置的坐标。geopos:获取地理位...

PostgreSQL不常用很有用的数据类型

PostgreSQL不常用很有用的数据类型

最近新项目开始,需要设计数据库,技术大佬用了很多我之前没见过的数据库数据类型,这里做个总结1.货币类型money类型存储固定小数精度的货币数字,表中展示的范围假设有两个小数位。可接受的输入格式很多,包...

发表评论    

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