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)

TLDR;MySql没有等效的varchar(max)概念,这是mssql Server的特性。

VARCHAR(max)是什么?

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)。

MySql没有相应的习惯用法。

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


varchar的最大长度是

65535

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

减去2字节来存储长度

减去所有其他列的长度

每8个可空列减去1个字节。如果你的列为空或非空,这将被存储为一个字节/字节称为空掩码,每列1位是空的。


Mysql转换列从VARCHAR到文本时,限制大小!!

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>

Sql Server

修改表prg_ar_report_colors添加Text_Color_Code VARCHAR(max);

MySql

alter table prg_ar_report_colors添加Text_Color_Code longtext

对甲骨文

alter table prg_ar_report_colors添加Text_Color_Code CLOB;