在MySQL中,VARCHAR(20000)是有效的吗?

68

我需要澄清一下MySQL varchar字段的最大长度。

我一直以为varchar字段的最大长度是255(255个什么?我假设是字符,但这可能是我困惑的来源)。在查看我们与外部公司合作设置的数据库表时,我看到一个设置为varchar(20000)的字段,它保存了超过255个字符的xml块。这是如何工作的? 20000是有效值吗?

通过一些搜索发现,在mysql中,varchar的限制为65,535字节,我看到varchar(65535)在使用,那么255的限制与此有何关系?

6个回答

79

请注意MySQL版本。

http://dev.mysql.com/doc/refman/5.0/en/char.html

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

如何查看MySQL的版本?

运行以下查询...

select version() as myVersion

啊!原来只是版本的更改,就这么简单(太让人松了口气了)。感谢你的帮助。 - Zoe
不客气,德丽拉。继续保持好的工作!很高兴看到像这样的问题让人们不断增长知识。 - Sampson
10
MySQL也接受VARCHAR(65536),但它会自动将该列提升为MEDIUMTEXT - Bill Karwin
3
我想补充一下这个答案:无论是哪个版本(至少到5.5),对于大于VARCHAR(767)的列添加索引都不起作用(包括主键)。 - Eduard Luca

12

8

如果你期望输入的内容过大,使用TEXT、MEDIUMTEXT或LONGTEXT会是更好的选择。


1
我同意。这正是我一直读到和所做的。但可惜,这个数据库不是我的,我只是试图理解我所看到的。但还是感谢你支持我的想法! - Zoe

3

这个问题的答案已经在这里

注意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类型,具有相同的最大长度和存储需求。


3

虽然无法在varchar(2000)上建立索引


1
它可以被构建。只需将索引长度限制为1000即可。 - Vladislav Rastrusny

1
MySQL手册说明:
VARCHAR列中的值为可变长度字符串。长度可以在MySQL 5.0.3之前的版本中指定为从0到255的值,在5.0.3及以后版本中可以指定为0到65,535个值。
因此,它取决于您使用的版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接