一尘不染

等价于MySQL中的varchar(max)?

mysql

MySQL中的varchar(max)等价于什么?


阅读 499

收藏
2020-05-17

共1个答案

一尘不染

varchar的最大长度取决于MySQL中的最大行大小,即64KB(不包括BLOB):

VARCHAR(65535)

但是,请注意,如果使用多字节字符集,则限制会更低:

VARCHAR(21844) CHARACTER SET utf8

这里有些例子:

最大行大小为65535,但是varchar还包括一个或两个字节来编码给定字符串的长度。因此,即使它是表中的唯一列,您实际上也无法声明最大行大小的varchar。

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

但是,如果我们尝试减少长度,我们会找到最大的长度:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

现在,如果我们尝试在表级别使用多字节字符集,则会发现它会将每个字符都计为多个字节。UTF8字符串 不一定
每个字符串都使用多个字节,但是MySQL无法假定您将所有以后的插入都限制为单字节字符。

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

尽管最后一个错误告诉我们,InnoDB仍然不喜欢21845的长度。

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

如果您计算得出21845 * 3 = 65535,那还是行得通的。而21844 * 3 = 65532,就可以了。

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
2020-05-17