MySQL中varchar(max)的等价性?

什么是MySQL中的varchar(max)的等价物?

一个varchar的最大长度取决于MySQL中的最大行大小,即64KB(不计算BLOB):

VARCHAR(65535) 

但是请注意,如果使用多字节字符集,则限制更低:

 VARCHAR(21844) CHARACTER SET utf8 

这里有些例子:

最大的行大小是65535,但是varchar还包含一个或两个字节来对给定string的长度进行编码。 所以你实际上不能声明最大行大小的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 

但是如果我们尝试减less长度,我们会发现最有效的长度:

 mysql> CREATE TABLE foo ( v VARCHAR(65532) ); Query OK, 0 rows affected (0.01 sec) 

现在,如果我们尝试在表级别使用多字节字符集,我们会发现它将每个字符计数为多个字节。 UTF8string不一定每个string使用多个字节,但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 

尽pipe最后一个错误告诉我们,但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)?

varchar(max)是Microsoft SQL Server的一个function。

在2005版之前,某列可以存储在Microsoft SQL Server版本中的数据量限制为8KB。 为了存储超过8KB的数据,你将不得不使用TEXTNTEXTBLOB列types,这些列types将它们的数据作为独立于表数据页面的8K页面的集合来存储; 他们支持每行存储高达2GB。

对这些列types的重要警告是,它们通常需要特殊的函数和语句来访问和修改数据(例如READTEXTWRITETEXTUPDATETEXT

在SQL Server 2005中,引入了varchar(max)来统一用于检索和修改大列数据的数据和查询。 varchar(max)列的数据与表数据页面内联存储。

由于MAX列中的数据填充了一个8KB的数据页面,溢出页面被分配,而前一页面指向它形成一个链接列表。 与TEXTNTEXTBLOB不同, varchar(max)列types支持与其他列types相同的查询语义。

所以varchar(MAX)真的意味着varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)而不是varchar(MAX_SIZE_OF_A_COLUMN)

MySql没有相应的习惯用法。

为了在MySql中获得与varchar(max)相同的存储量,您仍然需要使用BLOB列types。 本文讨论一种非常有效的在MySql中高效存储大量数据的方法。

varchar的最大长度是

65535

除以列设置为字符集中字符的最大字节长度(例如utf8 = 3字节,ucs2 = 2,latin1 = 1)。

减去2个字节来存储长度

减去所有其他列的长度

每8个可以为空的列减1个字节。 如果您的列为空/非空,则将其存储为一个字节/字节(称为空掩码)中的一位,每列可以为1位,可以为空。

对于Sql Server

alter table prg_ar_report_colors add Text_Color_Code VARCHAR(max);

对于MySql

alter table prg_ar_report_colors add Text_Color_Code longtext;

对于Oracle

alter table prg_ar_report_colors add 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> 

MySQL 5.6.12中varchar的最大长度是4294967295。