MySQL VARCHAR 的最大大小是多少?
Posted
技术标签:
【中文标题】MySQL VARCHAR 的最大大小是多少?【英文标题】:What is the MySQL VARCHAR max size? 【发布时间】:2012-11-10 12:07:31 【问题描述】:我想知道 mysql VARCHAR 类型的最大大小是多少。
我读到最大大小受限于大约 65k 的行大小。我尝试将字段设置为varchar(20000)
,但它说这太大了。
我可以将其设置为varchar(10000)
。我可以设置的确切最大值是多少?
【问题讨论】:
详细博客:goo.gl/Hli6G3 【参考方案1】:您可以使用TEXT
type,不限于64KB。
【讨论】:
这没有回答问题。 您的回答与问题无关。【参考方案2】:您也可以使用 MEDIUMBLOB/LONGBLOB 或 MEDIUMTEXT/LONGTEXT
MySQL 中的 BLOB 类型最多可存储 65,534 个字节,如果您尝试存储超过此数量的数据,MySQL 将截断数据。 MEDIUMBLOB 最多可存储 16,777,213 字节,LONGBLOB 最多可存储 4,294,967,292 字节。
【讨论】:
【参考方案3】:请记住,MySQL 有最大行大小限制
MySQL 表的内部表示具有 65,535 字节的最大行大小限制,不包括 BLOB 和 TEXT 类型。 BLOB 和 TEXT 列仅对行大小限制贡献 9 到 12 个字节,因为它们的内容与行的其余部分分开存储。阅读更多关于Limits on Table Column Count and Row Size.
单个列可以占用的最大大小,在 MySQL 5.0.3 前后不同
VARCHAR 列中的值是可变长度字符串。在 MySQL 5.0.3 之前,长度可以指定为 0 到 255 之间的值,在 5.0.3 和更高版本中可以指定为 0 到 65,535 的值。 MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,所有列共享)和使用的字符集。
但是,请注意,如果您使用 utf8 或 utf8mb4 等多字节字符集,则限制会更低。
使用TEXT
类型来克服行大小限制。
四种 TEXT 类型是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。这些对应于四种 BLOB 类型,并且具有相同的最大长度和存储要求。
有关 BLOB 和 TEXT 类型的更多详细信息
参考 MySQLv8.0 https://dev.mysql.com/doc/refman/8.0/en/blob.html 参考 MySQLv5.7 https://dev.mysql.com/doc/refman/5.7/en/blob.html 参考 MySQLv5.6 https://dev.mysql.com/doc/refman/5.6/en/blob.html更多
查看Data Type Storage Requirements 的更多详细信息,它处理所有数据类型的存储要求。
【讨论】:
什么是“长”字符串? 我尽量避免使用 TEXT 列,因为它们会导致在存在和排序时创建临时表 如果我使用 varchar(200) 作为名字并且我在这个字段中只存储了 6 个字符,那么名字将占用多少字节? @PareshGami - 6+1=7 个字符!与 CHAR 相比,VARCHAR 值存储为 1 字节或 2 字节长度前缀加上数据。 more...【参考方案4】:根据the online docs,有 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's utf8
encoding 而不是“真正的”UTF-8,最多可以有四个字节)。
但是,如果您的行大小接近 64K,您可能需要检查数据库的架构。这是一个罕见的表,需要在正确设置的 (3NF) 数据库中如此宽 - 可能, 只是不太常见。
如果您想使用更多,可以使用BLOB
或TEXT
类型。这些不计入行的 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
列“只能”存储大约 50 万个字符,(16M-1)/3 = 5,592,405
)但它仍然大大扩展了您的范围。
【讨论】:
请记住,TEXT 类型不能存储在内存表中,因此在 VARCHAR 就足够的情况下使用它们会显着降低性能。 MySql utf8 的 'utf8 的每个字符三个字节的属性',实际上根本不是 utf8。实际上,max. bytes in a utf-8 char 是 4。因此,您应该始终set the encoding toutf8mb4
in MySQL。 utf8mb4
是 MySql 的名称,其余的单词称为 utf8。
@StijndeWitt,谢谢。澄清以表明我的意思是 MySQL 的 utf8 编码方法而不是 UTF-8。我通常使用大写的变体来表示“真正的”UTF-8,因为这是公认的 IANA 约定。
delete_flag
是什么?【参考方案5】:
Source
varchar 的最大长度取决于 MySQL 中的最大行大小, 这是 64KB(不包括 BLOB):
VARCHAR(65535) 但是,请注意,如果您使用 多字节字符集:
VARCHAR(21844) 字符集 utf8
【讨论】:
请停止在示例中使用CHARACTER SET utf8
。它应该是CHARACTER SET utf8mb4
(如果您希望正确存储 all Unicode 文本......谁不想要呢?)
对于CHARSET=utf8mb4
使用VARCHAR(16383)
。
在 utf8 没有的情况下,使用 utf8mb4 会使您违反索引宽度的限制。如果您检查 utf8mb4 中包含但 utf8 中未包含的字符集,您可能会发现包含所有各种形式的象形文字和其他此类神秘字符集不值得显着的性能损失(根据经验确定)。它并不像 Stijn 所暗示的那样切碎和干燥。
许多表情符号也存在于 utf8mb4 中,而 utf8 中缺少,因此可能会改变是否值得的等式。【参考方案6】:
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://sforsuresh.in/mysql_varchar_max_length/
【讨论】:
【参考方案7】:来自 MySQL 文档:
MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度为 受限于最大行大小(65,535 字节,在 所有列)和使用的字符集。例如 utf8 字符 每个字符最多需要三个字节,因此 VARCHAR 列 使用utf8字符集可以声明最大21844 字符。
VARCHAR 的限制因使用的字符集而异。使用 ASCII 将使用每个字符 1 个字节。这意味着您可以存储 65,535 个字符。使用 utf8 将使用每个字符 3 个字节,导致字符限制为 21,844。但是,如果您使用的是现代多字节字符集 utf8mb4,您应该使用它!它支持表情符号和其他特殊字符。每个字符将使用 4 个字节。这会将每个表的字符数限制为 16,383。请注意,INT 等其他字段也将计入这些限制。
结论:
utf8 最多 21,844 个字符
utf8mb4 最多 16,383 个字符
【讨论】:
【参考方案8】:在我的情况下,我根据@Firze 的回答(带有 UTF8 限制)尝试了 20'000 并且 phpMyAdmin 以最大大小响应;答案是减少或选择 BLOB。
所以,我认为,最后,最好是根据你拥有的 MySQL 版本和使用的引擎来测试自己。由于 MySQL / phpMyAdmin 有保障。
【讨论】:
以上是关于MySQL VARCHAR 的最大大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章