我想知道 MySQL VARCHAR 类型的最大大小是多少。
我读到最大大小受大约 65k 的行大小限制。我尝试将字段设置为,varchar(20000)
但它说这太大了。
我可以将其设置为varchar(10000)
. 我可以设置的确切最大值是多少?
请记住,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 到65,535之间的值。MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,在所有列之间共享)和使用的字符集。
但是,请注意,如果您使用 utf8 或 utf8mb4 等多字节字符集,则限制会更低。
使用TEXT
类型来克服行大小限制。
四种 TEXT 类型是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。这些对应于四种 BLOB 类型,并且具有相同的最大长度和存储要求。
有关 BLOB 和 TEXT 类型的更多详细信息
更
查看有关处理所有数据类型的存储要求的数据类型存储要求的更多详细信息。
根据在线文档,有 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)数据库中如此宽 - 这是可能的,只是不是很常见。
如果你想使用更多,你可以使用BLOB
orTEXT
类型。这些不计入行的 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
),但它仍然大大扩展了您的范围。
varchar 的最大长度取决于 MySQL 中的最大行大小,即 64KB(不包括 BLOB):
VARCHAR(65535) 但是,请注意,如果您使用多字节字符集,则限制会更低:
VARCHAR(21844) 字符集 utf8
来自 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最多21,844 个字符
utf8mb4最多16,383个字符
您也可以使用 MEDIUMBLOB/LONGBLOB 或 MEDIUMTEXT/LONGTEXT
MySQL 中的 BLOB 类型最多可以存储 65,534 字节,如果您尝试存储超过此数量的数据,MySQL 将截断数据。MEDIUMBLOB 最多可存储 16,777,213 字节,LONGBLOB 最多可存储 4,294,967,292 字节。
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
就我而言,我根据@Firze 的回答(带有 UTF8 限制)尝试了 20'000 并且 phpMyAdmin 以最大大小响应;答案是减少或选择 BLOB。
所以,我认为,最后,最好是根据你拥有的 MySQL 版本和使用的引擎来测试自己。由于 MySQL/phpMyAdmin 有保障。
您可以使用TEXT
type,不限于 64KB。