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)
varchar(max)
是Microsoft SQL Server的一项功能.
列可以存储在2005版之前的Microsoft SQL Server版本中的数据量限制为8KB.为了存储超过8KB的您必须使用的TEXT
,NTEXT
或者BLOB
列类型,这些列类型将它们的数据存储为与表数据页分开的8K页的集合; 他们支持每行最多存储2GB.
大告诫这些列类型是,他们通常需要特殊的职能和声明,访问和修改的数据(例如READTEXT
,WRITETEXT
和UPDATETEXT
)
在SQL Server 2005中,varchar(max)
引入了统一用于检索和修改大列数据的数据和查询.varchar(max)
列的数据与表数据页一起存储.
当MAX列中的数据填充8KB数据页时,将分配溢出页,并且前一页指向它形成链表.与TEXT
,NTEXT
和BLOB
,varchar(max)
列类型支持所有相同的查询语义与其他列类型.
所以varchar(MAX)
真的意味着varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)
而不是varchar(MAX_SIZE_OF_A_COLUMN)
.
为了获得与varchar(max)
MySql中相同的存储量,您仍然需要求助于BLOB
列类型. 本文讨论了一种非常有效的方法,可以有效地在MySql中存储大量数据.
varchar的最大长度是
65535
除以字符集中字符集的最大字节长度(例如,utf8 = 3字节,ucs2 = 2,latin1 = 1).
减去2个字节来存储长度
减去所有其他列的长度
每8个可空的列减去1个字节.如果您的列为null/not null,则将其存储为一个称为空掩码的字节/字节中的一位,每列可以为1位.