社区
教程
Wiki
注册
登录
创作新主题
社区所有版块导航
Python
python开源
Django
Python
DjangoApp
pycharm
DATA
docker
Elasticsearch
分享
问与答
闲聊
招聘
翻译
创业
分享发现
分享创造
求职
区块链
支付之战
aigc
aigc
chatgpt
WEB开发
linux
MongoDB
Redis
DATABASE
NGINX
其他Web框架
web工具
zookeeper
tornado
NoSql
Bootstrap
js
peewee
Git
bottle
IE
MQ
Jquery
机器学习
机器学习算法
Python88.com
反馈
公告
社区推广
产品
短视频
印度
印度
一周十大热门主题
OpenAI被DeepSeek整急眼了?ChatGPT o3-mini深度测评
【DeepSeek:比ChatGPT危险100倍?它正在中文互联-20250205085327
2025必看AI干货!《大模型/AIGC/GPT-4/Transformer/DL/KG/NLP/C...
OpenAI:免费开放ChatGPT搜索,无需注册;“离境即退税”新政助力跨境电商出口海外仓发展
比ChatGPT危险100倍!DeepSeek正在中文互联网建造-20250204105308
JAG高被引综述文章!多模态深度学习的遥感数据融合综述
每日 GitHub 探索|大型语言模型、多代理 AI、AI 代理构建等开源项目盘点
DeepSeek下棋忽 ChatGPT 认输/《哪吒 2》票房又破新纪录/OpenAI CEO 再谈...
2025必看AI干货!《大模型/AIGC/GPT-4/Transformer/DL/KG/NLP/C...
DeepSeek上线20天日活超2000万是ChatGPT的40%,豆包推一年日活不到2000万|A...
关注
Py学习
»
DATABASE
为什么不建议在 MySQL 中使用 utf8 ?
K8S中文社区
• 1 月前 • 42 次点击
最近,小编在知乎上看到这样一个问题:
为什么不建议在MySQL中使用utf8 ?
秉持着和平交流的学习态度,小编精选了几位高赞知乎网友的精彩回答,分享给大家学习交流(勿上升、勿引战):
1号知乎网友:
灵狐技术
MySQL当年在支持utf8的时候,自作聪明整了些优化措施。
结果,大家使用过一段时间后,发现了这些优化措施,不能完整地支持utf8。
MySQL后面想修正这个bug。
但是,这个优化版utf8已经在外面大量使用了。
所以,
MySQL
只好保留了bug版的优化utf8,然后整了个utf8mb4来重新支持utf8标准。
MySQL的这个教训说明:
对于标准化的东西,别瞎捉摸;
你
的理解再怎么自认为有道理,没用!
只会闯祸!
你做的题,只要对不上公开的标准答案,就是零分……
张鹏华:
这个吃过大亏,现在很多订单里面会有表情符号,如果直接保存订单内容会直接从表情符号后截断,没有后面的内容
风之帆:
因为MySQL的utf8是阉割版的utf8,utf8mb4才是真正的utf8。
邵NewBee:
被坑过一次,项目开发上线了发现不支持表情回复。
精灵福将马国成:
我们公司最开始一个项目,当时MySQL数据库设置utf8,项目使用了半年,然后录入了广东那边一个人身份证名称带有生僻字,导致入库报错,后来我们把utf8改成utf8mb4就好了。
2号知乎网友:
写代码和简谈人文
MySQL的utf8只支持每个字符最多三个字节,而我们需要的是最多四个字节,从而我们在操作字符串时,会遇到一些很难溯源的bug(比如表情存储)。
MySQL在2010发布了utf8mb4来支持四个字节,可以说MySQL的utf8mb4是我们真正意义上的UTF-8。
MySQL本意是想在utf8上保持空间和速度,但是在使用utf8的char列时,实际使用的空间比预期更大,速度也慢,而且无法保存“”这样的字符,MySQL发布了utf8mb4来绕过了这个问题。
3号知乎网友:
CoderJia
在MySQL 8.0中,推荐使用的编码是utf8mb4。这种编码方式完全兼容utf8,每个字符最多占4个字节,就可以支持更多的字符,原来的utf8编码只能存储最多三个字节的字符,这在存储某些国家的文字或罕见字时有些困难了。
从MySQL 8.0版本开始,其默认的连接字符集从latin1改为了utf8mb4,同时字符序也从latin1_swedish_ci改为了utf8mb4_0900_ai_ci。当使用utf8mb4字符集时,通常推荐使用utf8mb4_unicode_ci或utf8mb4_general_ci排序规则。
SQL乱码问题
查看编码
my.ini配置文件
4号知乎网友:
爱可生云数据库
官方在后续的 MySQL 版本也会逐渐删除 utf8。
在深入探讨 utf8mb4 的好处之前,我们先澄清一下 utf8mb4 代表什么。在 MySQL 中,“utf8”是指支持 Unicode 字符集的字符编码,每个字符最多使用三个字节。然而,MySQL 中原始的 utf8 实现并没有涵盖所有 Unicode 字符。另一方面,utf8mb4 是 utf8 的修改版本,它支持完整的 Unicode 字符集,包括表情符号和其他补充字符,每个字符最多使用四个字节。
MySQL 中原始的 utf8 实现仅支持基本多文种平面(BMP)中的字符,大约占所有 Unicode 字符的 90%。另一方面,utf8mb4 支持整个 Unicode 字符集,包括表情符号和其他补充字符。它通过每个字符最多使用四个字节而不是 utf8 使用的三个字节来实现此目的。
下表显示了 utf8 和 utf8mb4 之间的区别:
注意:历史上,MySQL 使用字符集 utf8 作为 utf8mb3 的别名。但是,从 MySQL 8.0.28 开始,utf8mb3 仅在 SHOW 语句的输出和信息架构表中引用该字符集时使用。未来,utf8 有望成为 utf8mb4 的参考。为了避免任何歧义,建议在引用该字符集时显式指定 utf8mb4。
如您所见,utf8、utf8mb3 和 utf8mb4 之间的主要区别在于每个字符的最大字节数。utf8 和 utf8mb3 只能存储 BMP 中的字符,而 utf8mb4 还可以存储补充平面(Supplementary Plane)中的字符。这意味着 utf8mb4 可以支持更广泛的字符,包括表情符号、数学符号和其他特殊字符。
这三个字符集之间的另一个区别是它们在 MySQL 中的默认状态。utf8 是 MySQL 5.7 及更早版本中的默认字符集,而 utf8mb3 是 MySQL 8.0 中的默认字符集。但是,utf8mb4 是 MySQL 8.0.28 及更高版本中的默认字符集。
最后,MySQL 8.0 中已弃用 utf8 和 utf8mb3。这意味着它们最终将从 MySQL 中删除,因此建议使用 utf8mb4 代替。
因此,如果您需要存储所有 Unicode 字符,包括表情符号和其他补充字符,那么您应该使用 utf8mb4。但是,如果您只需要存储 BMP 中的字符,那么 utf8 可能就足够了。
5号知乎网友:
春秋的呓语
用不等式秒杀
MySQL utf8 ≠ utf8
-
“你和utf8发生过什么
惨案
故事?
”
欢迎在留言区交流~
整理丨dbaplus社群
来源丨https://www.zhihu.com/question/630892089
Python社区是高质量的Python/Django开发社区
本文地址:
http://www.python88.com/topic/177636
42 次点击
登录后回复