UTF-8 可以节省空间 , 在 UTF-8 中 , 字符“C”只需要 8 位 , 一些不常用的字符 , 比如“”需要 32 位 。其他的字符可能使用 16 位或 24 位 。一篇类似本文这样的文章 , 如果使用 UTF-8 编码 , 占用的空间只有 UTF-32 的四分之一左右 。
2. utf8 的简史
为什么 MySQL 开发者会让“utf8”失效? 我们或许可以从MySQL版本提交日志中寻找答案 。
MySQL 从 4.1 版本开始支持 UTF-8 , 也就是 2003 年 , 而今天使用的 UTF-8 标准(RFC 3629)是随后才出现的 。
旧版的 UTF-8 标准(RFC 2279)最多支持每个字符 6 个字节 。2002 年 3 月 28 日 , MySQL 开发者在第一个 MySQL 4.1 预览版中使用了 RFC 2279 。
同年 9 月 , 他们对 MySQL 源代码进行了一次调整:“UTF8 现在最多只支持 3 个字节的序列” 。
是谁提交了这些代码?他为什么要这样做?这个问题不得而知 。在迁移到 Git 后(MySQL 最开始使用的是 ) , MySQL 代码库中的很多提交者的名字都丢失了 。2003 年 9 月的邮件列表中也找不到可以解释这一变更的线索 。
不过我们可以试着猜测一下:
2002年 , MySQL做出了一个决定:如果用户可以保证数据表的每一行都使用相同的字节数 , 那么 MySQL 就可以在性能方面来一个大提升 。为此 , 用户需要将文本列定义为“CHAR” , 每个“CHAR”列总是拥有相同数量的字符 。如果插入的字符少于定义的数量 , MySQL 就会在后面填充空格 , 如果插入的字符超过了定义的数量 , 后面超出部分会被截断 。
搜索公纵号: , 关注回复[ vue ]获取前后端入门教程!
MySQL 开发者在最开始尝试 UTF-8 时使用了每个字符6个字节 , CHAR(1) 使用6个字节 , CHAR(2)使用12个字节 , 并以此类推 。
应该说 , 他们最初的行为才是正确的 , 可惜这一版本一直没有发布 。但是文档上却这么写了 , 而且广为流传 , 所有了解 UTF-8 的人都认同文档里写的东西 。
不过很显然 , MySQL 开发者或厂商担心会有用户做这两件事:
我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户 , 但他们搞砸了“utf8”编码 。
所以结果就是没有赢家 。那些希望在空间和速度上双赢的用户 , 当他们在使用“utf8”的 CHAR 列时 , 实际上使用的空间比预期的更大 , 速度也比预期的慢 。而想要正确性的用户 , 当他们使用“utf8”编码时 , 却无法保存像“”这样的字符 , 因为“”是4个字节的 。
在这个不合法的字符集发布了之后 , MySQL 就无法修复它 , 因为这样需要要求所有用户重新构建他们的数据库 。最终 , MySQL 在 2010 年重新发布了“”来支持真正的 UTF-8 。
三、总结
主要是目前网络上几乎所有的文章都把 “utf8” 当成是真正的 UTF-8 , 包括之前我写的文章以及做的项目(捂脸);因此希望更多的朋友能够看到这篇文章 。
相信还有很多跟我在同一条船上的人 , 这是必然的 。
8 。**
三、总结
主要是目前网络上几乎所有的文章都把 “utf8” 当成是真正的 UTF-8 , 包括之前我写的文章以及做的项目(捂脸);因此希望更多的朋友能够看到这篇文章 。
相信还有很多跟我在同一条船上的人 , 这是必然的 。
所以 , **大家以后再搭建MySQL、数据库时 , 记得将数据库相应编码都改为 。**终有一天 , 接你班儿的程序员发或你的领导现这个问题后 , 一定会在心里默默感到你的技术牛B 。
- 3 SQL笔记——MySQL数据类型(超详细且易理解)
- CFile使用主要方法答疑
- 建立中间表 在MySQL中建立多对多关系的映射
- mysql字符串排序规则_MySQL字符集和排序规则
- SSH 秘钥Key的简介以及生成和使用
- Jupyter 安装与使用
- mysql 显示所有用户_mysql查看全部用户
- Java基础2:Java IDE
- Nginx中使用htpasswd
- 全球网络加速器GA和内容分发网络CDN,哪个更适合您的组织使用?