MySQLvarchar怎么知道多少字节表示长度呢?

How does MySQL varchar know how many bytes indicate the length?

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

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

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

假设一个 255 个字符的 varchar 以以下字节开头:[255][w][o][r][d]~

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

现在假设一个 256 个字符的 varchar 以以下字节开头:[255][1][w][o][r][d]~

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

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

它发生在定义的时候。对于特定的 VARCHAR 列,所有长度前缀的字节大小相同。 VARCHAR 列将使用 2 个字节或 VARCHAR 列将使用 1 个字节,具体取决于定义的字符大小和字符集。

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

MySQL CHAR and VARCHAR Types 上的文档非常清楚地说明了这一点(强调我的):

A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

如果您将 VARCHAR(255) 列声明为使用 utf8 字符集,它仍将使用 2 个字节作为长度前缀,而不是 1 个字节,因为以字节为单位的长度可能大于255 个 utf8 个字符。