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
但如果我们try 减少长度,我们会发现最长的长度是有效的:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
现在,如果我们try 在表级别使用多字节字符集,我们会发现它将每个字符计为多个字节.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)