MySQL手册和几个StackOverflow答案清楚地表明varchar使用:
1 byte
适用于其中包含0-255 characters
的varchars 2 bytes
适用于其中包含more than 255 characters
的varchars。第一部分是有道理的。单个字节可以存储256个不同的值,即0到255。
我想知道的是MySQL如何知道多少字节表示长度。
想象一下255-char varchar以下列字节开头:[255][w][o][r][d]~
根据手册,只有第一个字节用于表示此场景中的长度。在阅读该字段时,MySQL将以某种方式知道这是这种情况,并且第二个字节不是长度的一部分。
现在假设一个256-char varchar以下列字节开头:[255][1][w][o][r][d]~
现在MySQL奇迹般地知道它应该在读取字段时将第一个两个字节解释为长度。
它如何区分?我提出的唯一万无一失的方法是将第一个字节解释为长度,然后确定文本长度是否匹配(在其当前编码中),如果不是,我们知道第一个两个 bytes必须是长度。
答案 0 :(得分:7)
它发生在定义时。对于特定的VARCHAR
列,所有长度前缀的字节大小都相同。 VARCHAR列将使用2个字节,或者VARCHAR列将使用1个字节,具体取决于定义的字符大小和字符集。
定义所有VARCHAR列,使其可能需要超过255个字节,使用2个字节来存储大小。 MySQL不会对列中的某些值使用1个字节而对其他值使用2个字节。
CHAR and VARCHAR Types上的MySQL文档非常清楚地表明了这一点(强调我的):
如果值不超过255,则列使用一个长度字节 如果值可能需要超过255个字节,则为两个长度字节。
如果声明VARCHAR(255)
列使用utf8
字符集,它仍将使用2个字节作为长度前缀,而不是1,因为字节长度可能是大于255,utf8
个字符。