MySQL中的varchar(max)等价于什么?
MySQL中的varchar(max)等价于什么?
Answers:
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)
DEFAULT
为该列声明一个值。使用TEXT或BLOB类型无法做到这一点。
TEXT
长度限制为64K。 MEDIUMTEXT
长度限制为16M。 LONGTEXT
长度限制为4G。
varchar(max)
列类型。
TLDR;MySql没有等价的概念varchar(max)
,这是MS SQL Server的功能。
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(max)
真正的含义。
varchar的最大长度为
65535
除以字符集中字符的最大字节长度,将列设置为(例如utf8 = 3字节,ucs2 = 2,latin1 = 1)。
减去2个字节以存储长度
减去所有其他列的长度
每8个可为空的列减去1个字节。如果您的列为空/不为空,则将其作为一个位存储在一个字节(称为空掩码)中,每列1位可为空。
修改表prg_ar_report_colors添加Text_Color_Code VARCHAR(max);
修改表prg_ar_report_colors添加Text_Color_Code longtext;
修改表prg_ar_report_colors添加Text_Color_Code CLOB;
小于限制大小时,将mysql的列从VARCHAR转换为TEXT!
mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Note | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)
mysql>