MySQLvarchar怎么知道多少字节表示长度呢?
How does MySQL varchar know how many bytes indicate the length?
MySQL 手册和几个 Whosebug 答案清楚地表明 varchar 使用:
1 byte
对于其中包含 0-255 characters
的 varchars
2 bytes
对于其中包含 more than 255 characters
的 varchars。
第一部分有道理。一个字节可以存储 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
个字符。
MySQL 手册和几个 Whosebug 答案清楚地表明 varchar 使用:
1 byte
对于其中包含0-255 characters
的 varchars2 bytes
对于其中包含more than 255 characters
的 varchars。
第一部分有道理。一个字节可以存储 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
个字符。