使用哪种数据类型更好,TEXT还是VARCHAR?

66

这个问题基于两个因素性能大小

使用哪种数据类型更好,TEXT还是VARCHAR?从性能角度来看,哪个会受到影响,哪个会改善性能?


3
注意:许多答案和评论已经过时,也不完全正确。 - Rick James
9个回答

109

这取决于你使用它的目的。我不想给出一个太泛泛的答案,但这是真的。一般来说,尽量让数据类型尽可能具体。如果你的字符串永远不会超过某个上限字符数,那么就选择VARCHAR,因为它会更加高效。如果你需要更多的空间,那么就选择TEXT。如果你不确定你的文本需要多少空间,那么你应该选择TEXT;性能差异并不是很大,最好是未雨绸缪,以防后来需求变化时需要更改。以上仅为个人建议。


在评论中,Pitarou指出,如果MySQL为你的查询创建了临时表(参见此处),TEXT列将不会存储在内存中,而必须从磁盘读取,这会更慢。(来源,页面底部)不过对于大多数查询来说,这并不重要。

如果有人想知道PostgreSQL的情况,我找到了这篇基准测试文章,显示CHAR、VARCHAR和TEXT的性能都相同。因此,如果你正在使用Postgres,无论使用哪种类型都没有关系。


1
+1 是因为它取决于具体情况,因为总是如此。顺便说一下,我以前曾将列从 varchar 改为 text,并且所有内容似乎都转换得很好。当数据类型更改时,MySQL 似乎会尝试智能地转换数据。 - rezzif
5
MySQL文档指出,TEXT数据类型可能会变慢,因为MEMORY存储引擎不支持该数据类型,因此仅在确实需要时才应使用TEXT。 http://dev.mysql.com/doc/refman/5.5/en/blob.html - Pitarou
1
@Pitarou:只有在使用会导致临时表的查询时才会出现这种情况,因此对于简单的查询来说并不重要。不过,这是一个很好的发现,知道这一点很有用。 - Sasha Chedygov
1
我认为对于MySQL >= V 5.0.3,@noushy提供的更好的答案是正确的,因为VARCHAR从那个版本开始允许长度达到64k。因此,与TEXT相比,它没有任何缺点(顺便说一下,TEXT有一个固定的上限为64k),同时仍然具有潜在的更好性能。 - Bastian Blankenburg
@RickJames 这个问题是关于 TEXT 或 VARCHAR 而不是 MEDIUMTEXT 的,所以我认为最大 64kb 已经足够了,MEDIUMTEXT 在这里并不必要或相关。 - Bastian Blankenburg
显示剩余4条评论

7

2
基准测试是虚假的 - “TEXT”版本在“PRIMARY KEY”中使用前缀索引。但“VARCHAR”版本没有。 - Rick James

7
从 V 5.0.3 开始,VARCHAR 的限制从 0 到 256 增加到 0 到 65,535(受最大行大小(65,535 字节,其中包括所有列)和使用的字符集限制)。参考文献 http://dev.mysql.com/doc/refman/5.0/en/char.html 如果您使用的是固定长度为64k的 TEXT,即使需要更少的限制,也最好选择具有更高限制的 VARCHAR。 如果需求超过64K,请相应地选择 MEDIUMTEXT 或 LONGTEXT。

这是真的吗,固定的64k长度?难道数据不是像单独的文本文件一样存储在磁盘上吗? - Simon Baars
@SimonBaars - 没有固定的64k。不是分开的文件;而是分开的块,并且并非总是如此。 - Rick James

2

在我看来,如果您知道字符的长度,VARCHAR 是最好的选择。它还可以减少垃圾内存分配和空间问题。TEXT 将消耗 255,而 VARCHAR 将消耗您为其提供的值。

就性能而言,VARCHAR 比 TEXT 更快。


2

VARCHAR是一种数据类型,它可以为每个记录设置接受的字符数限制,而文本类型(虚拟上)则没有限制。关于性能我不太确定,但我认为更具体的数据类型(如VARCHAR)会更快。


1
65535字节不是“虚拟”限制。 - dolmen

2

VARCHAR应该具有更好的性能,因为它有一个有限的大小。实际上,在我使用MySQL的所有经验中,VARCHAR的搜索操作总是比TEXT更快。无论如何,这是基于我的经验。您应该查看文档以了解更多信息。


2

这取决于你的数据类型。

如果你的字段是固定长度的(例如32个字符的哈希值),那么请使用CHAR。这样做可以提高性能,因为每个条目在每行中占用相同的空间。

VARCHAR的标准限制是255个字符,但我认为现在已经增加了。TEXT非常长,通常仅用于大型内容,例如整篇博客文章和评论,如果您不想有限制。

就大小而言,VARCHAR和TEXT之间没有(或很少)区别,因为它们只存储所需内容。CHAR字段始终占用其分配的长度。

就性能而言,VARCHAR通常更快。VARCHAR也可以进行索引,从而实现更快的搜索。


2
MySQL在创建临时表时会将TEXT内部转换为varchar。因此,如果可能的话,最好使用VARCHAR。与TEXT列相关的一些小错误,例如... http://bugs.mysql.com/bug.php?id=36676

不总是更好的解决方案!http://nicj.net/mysql-text-vs-varchar-performance/ - Profet

-4

text和varchar之间有微妙的差别。我有一个如下所示的表:

CREATE TABLE `test`.`tbl`(
  `kee` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `txt` TEXT(100),
  `vrchr` VARCHAR(100),
  PRIMARY KEY (`kee`)
);

我插入了一行:

 INSERT INTO `tbl`
            (`txt`,
             `vrchr`)
VALUES ('1        
         2
         3',
        '1
         2
         3');

txt 的值为:
1
2
3

而列 vrchr 的值为:
1


1
你确定你正在使用数据库管理系统吗? - brunocascio
不确定为什么你在这件事上受到了如此严厉的批评。对于存储包含换行符以进行打印的字符串的人来说,这非常重要,可以帮助调试缺失的字符。 - Mark Seagoe

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