什么是 varchar(max) 在 MySQL 中的等价物?
最佳答案
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 不能假设您将所有 future 的插入限制为单字节字符。
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)
关于mysql - 相当于 MySQL 中的 varchar(max)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332798/