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 字节必须是长度.
它发生在定义时。对于特定的
VARCHAR
列,所有长度前缀的大小都相同(以字节为单位)。 VARCHAR
列将使用 2 个字节,或 VARCHAR
列将使用 1 个字节,具体取决于定义的字符大小和字符集。
所有定义的
VARCHAR
列可能需要超过 255 个字节,使用 2 个字节来存储大小。 MySQL 不会对列中的某些值使用 1 个字节,而对其他值使用 2 个字节。
关于 CHAR 和 VARCHAR 类型的 MySQL 文档 非常清楚地说明了这一点(强调我的):
如果值要求不超过 255,则一列使用一个长度字节 字节,如果值可能需要超过 255 个字节,则为两个长度字节。
如果声明
VARCHAR(255)
列以使用 utf8
字符集,它仍然会使用 2 个字节作为长度前缀,而不是 1,因为使用 utf8
字符时,字节长度可能大于 255。