等价于MySQL中的varchar(max)?


Answers:


195

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)

20
我也建议您使用TEXT
Adi 2012年

2
@AdnanShammout:可以,除非您要DEFAULT为该列声明一个值。使用TEXT或BLOB类型无法做到这一点。
Bill Karwin 2012年

5
@DanW,TEXT长度限制为64K。 MEDIUMTEXT长度限制为16M。 LONGTEXT长度限制为4G。
Bill Karwin

4
这个最大的问题是,如果你创建一个大小的列,你只能有一个在你的表列。MySql中的最大行大小为64k,因此,如果您有64k列,仅此而已。此约束不适用于Sql Server的varchar(max)列类型。
joshperry

1
@joshperry,是的,但是TEXT / BLOB列仅计入64KB行大小限制中的一小部分(9-12字节),因此,如果您需要较大的VARCHAR以及许多其他列,则最好使用TEXT。
Bill Karwin

74

TLDR;MySql没有等价的概念varchar(max),这是MS SQL Server的功能。

什么是VARCHAR(max)?

varchar(max) 是Microsoft SQL Server的功能。

在2005版之前的Microsoft SQL Server版本中,列可以存储的数据量限制为8KB。为了存储8KB以上的数据,您将不得不使用TEXTNTEXTBLOB列类型,这些列类型将其数据存储为与表数据页分开的8K页的集合;他们支持每行最多存储2GB。

大告诫这些列类型是,他们通常需要特殊的职能和声明,访问和修改的数据(例如READTEXTWRITETEXTUPDATETEXT

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

当MAX列中的数据填充8KB数据页时,将分配一个溢出页,并且上一页指向该溢出页,从而形成链接列表。不像TEXTNTEXTBLOB所述varchar(max)列类型支持所有相同的查询的语义其他列类型。

所以varchar(MAX)真的意味着varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)没有varchar(MAX_SIZE_OF_A_COLUMN)

MySql没有等效的习惯用法。

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


1
与MySQL相比,这与SQL Server的关系更大。
Kermit

14
@njk是的,但是为了解释MySql中的“等效”(或在这种情况下缺少等效),必须确切描述varchar(max) 真正的含义。
joshperry

29

varchar的最大长度为

65535

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

减去2个字节以存储长度

减去所有其他列的长度

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


我喜欢您答案的格式,但是似乎缺少最佳答案提供的有关字符集和内容的一些有用信息
Joe Phillips

3

对于Sql Server

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

对于MySQL

修改表prg_ar_report_colors添加Text_Color_Code longtext;

对于Oracle

修改表prg_ar_report_colors添加Text_Color_Code CLOB;


1
请注意,longtext,text和blob的存储方式与varchar不同。varchar与其他字段一起存储,而文本存储在服务器中的单独文件中。它具有优缺点,因此请谨慎选择
圣地亚哥阿里斯蒂

0

小于限制大小时,将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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.