VARCHAR(M) 到底占用多少个字节?|mysql系列(2)

如题所述

第1个回答  2022-06-11

前言

这个问题其实很有迷惑性,问的是字节,不是字符,我们知道在计算机中只能存储二进制数据。所以要搞清楚这个问题?就要搞清楚下面2个问题:

为了搞清楚上面两个问题,又必须搞清楚mysql 的字符集 和比较规则,以及mysql记录的存储结构。这里我们都是以常用的InnoDB引擎为讨论的前提的。

如果你了解了上面的问题,你也可以回答下面的问题

字符集和排序规则

计算机中的的落盘存储都是二进制数据:即bit。所以我们存储字符串的话就要建立字符与二进制数据的映射关系了。

将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。mysql抽象出一个概念来描述某个字符范围的编码规则 ,这个概念就叫 字符集。

比如:

对于比较规则,就是数据哪个放前面哪个放后面的问题。对于某一种字符集来说,比较两个字符大小的规则可以制定出很多种,也就是说同一种字符集可以有多种比较规则。

常用字符集

字符集收录字符其他ASCII字符集共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符ISO8859-1字符集共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名latin1GB2312字符集录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容ASCII字符集如果该字符在ASCII字符集中,则采用1字节编码。GBK字符集GBK字符集只是在收录字符范围上对GB2312字符集作了扩充,编码方式上兼容GB2312utf8字符集收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用utf8mb4

如上图所示5.7.22版本一共支持41种字符集 , Default collation 表示 字符集默认比较规则。 Maxlen 代表该种字符集表示一个字符最多需要几个字节。

这个时候就可以回答2个问题了。


好了,那我们现在知道VARCHAR(M) 到底占用多少个字符 就和mysql 设置的字符集有关系了。

所以下面我们看看VARCHAR(M)落到物理磁盘到底占用多少个字节,用字符集的Maxlen * M 就能得到 字节数了。这就是答案了。

现在我们引申出另外一个问题,varchar 最大能保存多少个字节呢?这个我们下次讨论。