我想知道MySQL VARCHAR类型的最大大小是什么。
我读到最大大小受行大小限制,约为65k。我尝试将字段设置为varchar(20000),但它说这太大了。
我可以把它设置为varchar(10000)我能设置的最大值是多少?
我想知道MySQL VARCHAR类型的最大大小是什么。
我读到最大大小受行大小限制,约为65k。我尝试将字段设置为varchar(20000),但它说这太大了。
我可以把它设置为varchar(10000)我能设置的最大值是多少?
当前回答
来自MySQL文档:
在MySQL 5.0.3及以后版本中,VARCHAR的有效最大长度是 取决于最大行大小(65,535字节,由 所有列)和使用的字符集。例如,utf8字符 每个字符最多需要三个字节,所以一个VARCHAR列 使用utf8字符集最多可以声明为21,844 字符。
Limits for the VARCHAR varies depending on charset used. Using ASCII would use 1 byte per character. Meaning you could store 65,535 characters. Using utf8 will use 3 bytes per character resulting in character limit of 21,844. BUT if you are using the modern multibyte charset utf8mb4 which you should use! It supports emojis and other special characters. It will be using 4 bytes per character. This will limit the number of characters per table to 16,383. Note that other fields such as INT will also be counted to these limits.
结论:
Utf8最大21,844个字符
Utf8mb4最多16,383个字符
其他回答
请记住,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类型来克服行大小限制。
这四种文本类型分别是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
更
有关数据类型存储要求的详细信息,其中涉及所有数据类型的存储要求。
源
varchar的最大长度取决于MySQL中的最大行大小, 64KB(不包括blob): 但是,请注意,如果您使用 多字节字符集: VARCHAR(21844)字符集utf8
您可以使用TEXT类型,不限制为64KB。
在我的情况下,我尝试了20'000根据@Firze答案(UTF8限制)和phpMyAdmin响应的最大大小;答案是减少或选择BLOB。
所以,我认为,最后,最好是根据你拥有的MySQL版本和使用的引擎来测试自己。因为MySQL / phpMyAdmin有安全措施。
根据在线文档,有一个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)数据库中,很少需要这么宽的表——这是可能的,只是不太常见。
If you want to use more than that, you can use the BLOB or TEXT types. These do not count against the 64K limit of the row (other than a small administrative footprint) but you need to be aware of other problems that come from their use, such as not being able to sort using the entire text block beyond a certain number of characters (though this can be configured upwards), forcing temporary tables to be on disk rather than in memory, or having to configure client and server comms buffers to handle the sizes efficiently.
允许的尺寸为:
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),但它仍然极大地扩展了您的范围。