mysql 的 utf8mb4 是定长存储吗?

闲来无事,在知乎看到:

图片.png

为什么 mysql 要额外加入一个 utf8mb4 数据类型,而不是原地升级 utf8? - 啃泥周公子的回答 - 知乎
https://www.zhihu.com/questio...

如果我选择了 utf8mb4 (表级别、也是字段级别),但是我存储的是:abc 三个字母,占了硬盘 3 字节还是 12 字节?

阅读 2.5k
2 个回答

不是,是变长的。1 个英文字符占 1 个字节。

原本的 utf8mb3 也是变长的,mb 就是 Most Bytes 的缩写,mbN 就是“最多 N 个字节”,从名字上就能看出来它是变长的,要不然这个 Most 修饰的有啥用?

所以他讲定长严格来说是错的,定长的不是 utf8mb3 字符集本身,而是 Static (Fixed-Length) Table Characteristics 之类的存储结构。不过这个特性在 MyISAM 存储引擎里是默认开启的,而 MyISAM 是 MySql 早期版本的最流行的存储引擎,所以他这么说从某种程度上也算对,但仅限于 MyISAM 里,等到 5.5 以后 InnoDB 成默认引擎后这个说法就不成立了。


我们先看文档,先看 Oracle 对 utf8mb4 是怎么描述的:

REF: https://dev.mysql.com/doc/ref...

utf8mb4 contrasts with the utf8mb3 character set, which supports only BMP characters and uses a maximum of three bytes per character:

  • For a BMP character, utf8mb4 and utf8mb3 have identical storage characteristics: same code values, same encoding, same length.
  • For a supplementary character, utf8mb4 requires four bytes to store it, whereas utf8mb3 cannot store the character at all. When converting utf8mb3 columns to utf8mb4, you need not worry about converting supplementary characters because there are none.

这里提到 “对于 BMP 字符,utf8mb4 跟 utf8mb3 有相同的存储特征:相同的代码值、相同的编码、相同的长度”。

那么 utf8mb3 到底长度是多少呢?

REF: https://dev.mysql.com/doc/ref...

image.png

注意看第一行,“utf8mb3 是变长的,1-3 个字节”。

P.S. 所谓 BMP 就是 Unicode 里的一个区段(范围从 U+0000 到 U+FFFF),包含了世界上绝大部分常见语言的常见字符。

新手上路,请多包涵

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)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题