小编典典

相当于 MySQL 中的 varchar(max)?

all

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


阅读 185

收藏
2022-06-28

共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

如果您计算出 218453 = 65535,那么这完全有道理,无论如何这都行不通。而 218443 = 65532,确实有效。

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
2022-06-28