MySQL VARCHAR的最大大小是多少?


300

我想知道MySQL VARCHAR类型的最大大小是多少。

我读到最大大小受行大小限制,大约65k。我尝试将字段设置为,varchar(20000)但是它说太大了。

我可以将其设置为varchar(10000)。我可以将其设置为多少?


1
详细博客:goo.gl/Hli6G3
Suresh Kamrushi

Answers:


293

请记住,MySQL具有最大行大小限制

MySQL表的内部表示形式的最大行大小限制为65,535字节,不包括BLOB和TEXT类型。BLOB和TEXT列仅对行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。阅读有关表列数和行大小限制的更多信息

单列可占用的最大大小,在MySQL 5.0.3之前和之后是不同的

VARCHAR列中的值是可变长度的字符串。在MySQL 5.0.3之前,长度可以指定为0到255之间的值,而在5.0.3和更高版本中,长度可以指定为0到65535之间的值。在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和所使用的字符集。

但是,请注意,如果使用多字节字符集(如utf8或utf8mb4),则该限制会降低。

使用TEXT类型以克服行大小限制。

四种TEXT类型是TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT。这些对应于四种BLOB类型,并且具有相同的最大长度和存储要求。

有关BLOB和TEXT类型的更多详细信息

查阅有关数据类型存储要求的更多详细信息,该要求处理所有数据类型的存储要求。


4
什么是“长”字符串?
理查德H

6
我会尽量避免TEXT列,虽然因为它们可以导致创建临时表时,现在和排序
罗伯特·斯威舍

1
如果我将varchar(200)作为名字,并且我在此字段中仅存储6个字符,那么将占用多少个字节的名字?
Paresh Gami 2015年

2
@PareshGami-6 + 1 = 7个字符!与CHAR相比,VARCHAR值存储为1字节或2字节长的前缀以及数据。更多...
rajukoyilandy 2015年

58

按照 在线文档,行限制为64K,您可以使用以下方法计算行大小:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

您需要记住,列长度不是其大小的一对一映射。例如,对于CHAR(10) CHARACTER SET utf8十个字符中的每个字符,需要三个字节,因为该特定编码必须考虑到的三字节每字符属性utf8(即MySQL的utf8编码而不是“真实的” UTF-8,该字符最多可以包含四个字节) )。

但是,如果行大小接近64K,则可能需要检查数据库的架构。这是一个罕见的表,在适当设置的(3NF)数据库中需要那么宽- 可能,不是很常见。

如果您想使用更多功能,可以使用 BLOBTEXT类型。这些不计入该行的64K限制(除了很小的管理占用空间),但是您需要意识到使用它们所产生的其他问题,例如无法使用超过一定数量的整个文本块进行排序字符(尽管可以向上配置),迫使临时表位于磁盘上而不是内存中,或者必须配置客户端和服务器的通讯缓冲区来有效地处理大小。

允许的大小为:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

您仍然存在字节/字符不匹配的情况(这样一MEDIUMTEXT utf8列只能存储“大约”一百万个字符(16M-1)/3 = 5,592,405),但是它仍然大大扩展了您的范围。


4
请记住,TEXT类型不能存储在内存表中,因此在VARCHAR足够时使用它们会造成很大的性能损失。
卡姆登S.

MySql utf8的“ utf8的每个字符三个字节的属性”,实际上根本不是utf8。实际上,最大 utf-8 char中的字节4。因此,您应始终在MySQL 中将编码设置为utf8mb4utf8mb4是MySql的名称,其余单词称为utf8。
Stijn de Witt

1
@StijndeWitt,谢谢。澄清表明我的意思是MySQL的utf8编码方法而不是UTF-8。我通常使用大写变体表示“真实” UTF-8,因为这是公认的IANA约定。
paxdiablo 2015年

41

资源

varchar的最大长度取决于MySQL中的最大行大小,即64KB(不包括BLOB):

VARCHAR(65535)但是,请注意,如果使用多字节字符集,则该限制会降低:

VARCHAR(21844)字符集utf8


20
请停止使用CHARACTER SET utf8示例。应该是CHARACTER SET utf8mb4(如果您希望所有 Unicode文本都正确存储...而谁又不想呢?)
Stijn de Witt 2015年

4
CHARSET=utf8mb4使用VARCHAR(16383)
威尔摩尔三世

3
在utf8不能使用的情况下,使用utf8mb4将使您超出索引宽度的限制。如果检查utf8mb4中包含的字符集,但不检查utf8中包含的字符集,则可能会发现,包括所有各种形式的象形文字和其他此类奥术字符集都不值得大幅度提高性能(凭经验确定)。它不像Stijn所暗示的那样被切割和干燥。
kcrossen

utf8mb4中还存在许多表情符号,而utf8中缺少这些表情符号,因此这可能会改变是否值得的等式。
Brian Morearty

23

从MySQL文档中:

在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和所使用的字符集。例如,utf8字符每个字符最多需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符。

VARCHAR的限制取决于所使用的字符集。使用ASCII将每个字符占用1个字节。意味着您可以存储65,535个字符。使用utf8将每个字符使用3个字节,导致字符限制为21,844。但是,如果您使用的是现代多字节字符集utf8mb4,则应该使用它!它支持表情符号和其他特殊字符。每个字符将使用4个字节。这会将每个表的字符数限制为16,383。请注意,其他字段(例如INT)也将计入这些限制。

结论:

utf8最多21844个字符

utf8mb4最多16,383个字符


6

您还可以使用MEDIUMBLOB / LONGBLOB或MEDIUMTEXT / LONGTEXT

MySQL中的BLOB类型最多可以存储65,534个字节,如果您尝试存储的数据量过多,MySQL将截断该数据。MEDIUMBLOB最多可以存储16,777,213字节,而LONGBLOB最多可以存储4,294,967,292字节。


3

在Mysql版本5.0.3之前,Varchar数据类型可以存储255个字符,但是从5.0.3开始,它可以存储65,535个字符。

但是它的最大行大小限制为65,535个字节。这意味着包括所有列在内,其长度不得超过65,535个字节。

在您的情况下,当您尝试设置大于10000时,可能会超过65,535,并且mysql将给出错误。

有关更多信息:https : //dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

带有示例的博客:http : //goo.gl/Hli6G3


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.