MySQL varchar 如何知道有多少字节表示长度?

问题描述 投票:0回答:1

MySQL 手册和几个 StackOverflow 答案清楚地表明 varchar 使用:

  • 1 byte
    用于其中包含
    0-255 characters
    的 varchar
  • 2 bytes
    用于其中包含
    more than 255 characters
    的 varchar。

第一部分是有道理的。单个字节可以存储 256 个不同的值,即 0 到 255。

我想弄清楚MySQL如何知道有多少字节表示长度

想象一个 255 个字符的 varchar 以以下字节开头:

[255][w][o][r][d]~

根据手册,这种场景下只用第一个字节来表示长度。当读取该字段时,MySQL 必须以某种方式知道这里就是这种情况,并且第二个字节不是长度的一部分。

现在想象一个 256 个字符的 varchar 以以下字节开头:

[255][1][w][o][r][d]~

现在 MySQL 奇迹般地知道,在读取字段时,它应该将前两个字节解释为长度。

如何区分?我想出的唯一万无一失的方法是仅将第一个字节解释为长度,然后确定文本长度是否匹配(以其当前编码),如果不匹配,我们知道前 two 字节必须是长度.

mysql char byte varchar maxlength
1个回答
12
投票

它发生在定义时。对于特定的

VARCHAR
列,所有长度前缀的大小都相同(以字节为单位)。
VARCHAR
列将使用 2 个字节,或
VARCHAR
列将使用 1 个字节,具体取决于定义的字符大小和字符集。

所有定义的

VARCHAR
列可能需要超过 255 个字节,使用 2 个字节来存储大小。 MySQL 不会对列中的某些值使用 1 个字节,而对其他值使用 2 个字节。

关于 CHAR 和 VARCHAR 类型的 MySQL 文档 非常清楚地说明了这一点(强调我的):

如果值要求不超过 255,则一列使用一个长度字节 字节,如果值可能需要超过 255 个字节,则为两个长度字节。

如果声明

VARCHAR(255)
列以使用
utf8
字符集,它仍然会使用 2 个字节作为长度前缀,而不是 1,因为使用
utf8
字符时,字节长度可能大于 255。

© www.soinside.com 2019 - 2024. All rights reserved.