闲来无事,在知乎看到:
为什么 mysql 要额外加入一个 utf8mb4 数据类型,而不是原地升级 utf8? - 啃泥周公子的回答 - 知乎
https://www.zhihu.com/questio...
如果我选择了 utf8mb4
(表级别、也是字段级别),但是我存储的是:abc
三个字母,占了硬盘 3 字节还是 12 字节?
闲来无事,在知乎看到:
为什么 mysql 要额外加入一个 utf8mb4 数据类型,而不是原地升级 utf8? - 啃泥周公子的回答 - 知乎
https://www.zhihu.com/questio...
如果我选择了 utf8mb4
(表级别、也是字段级别),但是我存储的是:abc
三个字母,占了硬盘 3 字节还是 12 字节?
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。而一些emoji表情,占用4字节,所以utf-8下,表情会乱码,1字符装不下,需要额外的空间
而utf8mb4可以保存4 字节长度的 UTF-8 字符,所以使用utf8mb4来存储emoji表情,不常用的汉字以及新增的Unicode字符比较合适。
varchar:
varchar(255)所表示的单位是字符,而一个汉字一个字母都是一字符。所以这里可以存储255个汉字或者255个字母。
utf-8下,1字符=3字节。(uft-8也称之为utf-8mb3)
utf-8mb4下,1字符=4字节
存储上限
varchar的存储上限是65535字节
utf-8格式: varchar(21845)是上限(65535/3)
utf-8mb4: varchar(16383)是上限(65535/4)
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
5 回答1.4k 阅读
不是,是变长的。1 个英文字符占 1 个字节。
原本的 utf8mb3 也是变长的,mb 就是
Most Bytes
的缩写,mbN 就是“最多 N 个字节”,从名字上就能看出来它是变长的,要不然这个 Most 修饰的有啥用?所以他讲定长严格来说是错的,定长的不是 utf8mb3 字符集本身,而是 Static (Fixed-Length) Table Characteristics 之类的存储结构。不过这个特性在 MyISAM 存储引擎里是默认开启的,而 MyISAM 是 MySql 早期版本的最流行的存储引擎,所以他这么说从某种程度上也算对,但仅限于 MyISAM 里,等到 5.5 以后 InnoDB 成默认引擎后这个说法就不成立了。
我们先看文档,先看 Oracle 对 utf8mb4 是怎么描述的:
这里提到 “对于 BMP 字符,utf8mb4 跟 utf8mb3 有相同的存储特征:相同的代码值、相同的编码、相同的长度”。
那么 utf8mb3 到底长度是多少呢?
注意看第一行,“utf8mb3 是变长的,1-3 个字节”。
P.S. 所谓 BMP 就是 Unicode 里的一个区段(范围从 U+0000 到 U+FFFF),包含了世界上绝大部分常见语言的常见字符。