您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

等价于MySQL中的varchar(max)?

等价于MySQL中的varchar(max)?

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)
MySQL 2022/1/1 18:19:18 有456人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶