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