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

时间:2015-04-08 13:33:57

标签: mysql char byte varchar maxlength

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必须是长度。

1 个答案:

答案 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个字符。