ChatGPT解决这个技术问题 Extra ChatGPT

MySQL VARCHAR 的最大大小是多少?

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

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

我可以将其设置为 varchar(10000)。我可以设置的确切最大值是多少?

详细博客:goo.gl/Hli6G3

r
rajukoyilandy

请记住,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 类型的更多详细信息

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...
p
paxdiablo

根据 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)数据库中如此宽 - 这是可能的,只是不是很常见。

如果您想使用更多,可以使用 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 列可以“仅”存储大约 50 万个字符,(16M-1)/3 = 5,592,405),但它仍然大大扩展了您的范围。


请记住,TEXT 类型不能存储在内存表中,因此在 VARCHAR 就足够的情况下使用它们会显着降低性能。
MySql utf8 的“utf8 的每个字符三个字节的属性”,实际上根本不是 utf8。实际上,max. bytes in a utf-8 char4。因此,您应该始终set the encoding to utf8mb4 in MySQLutf8mb4 是 MySql 的名称,其余部分称为 utf8。
@StijndeWitt,谢谢。澄清以表明我的意思是 MySQL 的 utf8 编码方法而不是 UTF-8。我通常使用大写的变体来表示“真正的”UTF-8,因为这是公认的 IANA 约定。
delete_flag 是什么?
C
Community

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 中缺少,因此这可能会改变是否值得的等式。
F
Firze

来自 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 个字符


S
SRIRAM

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

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


S
Suresh Kamrushi

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/


M
Meloman

就我而言,我根据@Firze 的回答(带有 UTF8 限制)尝试了 20'000 并且 phpMyAdmin 以最大大小响应;答案是减少或选择 BLOB。

所以,我认为,最后,最好是根据你拥有的 MySQL 版本和使用的引擎来测试自己。由于 MySQL/phpMyAdmin 有保障。


m
mvp

您可以使用 TEXT type,它不限于 64KB。


这没有回答问题。
您的回答与问题无关。