哪个DATATYPE最好使用TEXT或VARCHAR?

时间:2009-07-29 23:50:33

标签: mysql

此问题基于两个方面效果尺寸

使用TEXT或VARCHAR哪个DATATYPE更好?基于将影响和将影响的表现?

9 个答案:

答案 0 :(得分:97)

这取决于你使用它的目的。我讨厌给出这样一个通用答案,但这是真的。通常,尝试尽可能具体地获取数据类型。如果您的字符串永远不会超过字符的某些上限,那么请使用VARCHAR,因为它会更有效率。如果您需要更多空间,请使用TEXT。如果您不确定文本将占用多少空间,则应该使用TEXT;性能差异不是很大,并且最好是面向未来,而不是在您的需求发生变化时必须稍后更改它的风险。只是我的两分钱。


在评论中,Pitarou指出,如果MySQL为您的查询创建临时表(请参阅this),TEXT列将不会存储在内存中,并且必须从磁盘,慢得多。 (Source,页面底部。)但这对大多数查询都无关紧要。

如果有人想知道PostgreSQL如何比较,我发现this benchmark表明CHAR,VARCHAR和TEXT的表现同样出色。因此,如果您使用的是Postgres,那么使用哪种类型并不重要。

答案 1 :(得分: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,其上限而不是TEXT。 如果要求超过64K,请相应使用MEDIUMTEXT或LONGTEXT。

答案 2 :(得分:6)

  

针对TEXT表的查询总是比针对VARCHAR表的查询慢3倍(平均值:VARCHAR表为0.10秒,TEXT表为0.29秒)。差异是100%可重复的。

来自http://forums.mysql.com/read.php?24,105964,105964

的基准

答案 3 :(得分:3)

VARCHAR你可以设置每个记录接受多少个字符的限制,文本是(几乎)无限的...不完全确定性能,但我会假设一个更具体的数据类型(varchar)会更快。 / p>

答案 4 :(得分:3)

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

答案 5 :(得分:2)

这实际上取决于您的数据类型。

如果您的字段是固定长度的(例如,32个字符的哈希值),则使用CHAR。这具有更好的性能,因为每个条目每行占用相同的空间。

VARCHAR的标准限制是255个字符,但我认为它现在已经增加了。 TEXT非常长,通常只用于整篇博客文章等大内容,如果你不想要限制,则会发表评论。

关于大小,VARCHAR和TEXT之间没有(或很少)区别,因为它们只存储了他们需要的东西。 CHAR字段将始终占用其分配的长度。

性能方面,VARCHAR通常更快。 VARCHAR也可以编入索引,从而加快搜索速度。

答案 6 :(得分:2)

MySQL会在创建临时表时将TEXT内部转换为varchar。因此,如果可能,最好使用VARCHAR。有一些与TEXT列相关的小错误,例如......

http://bugs.mysql.com/bug.php?id=36676

答案 7 :(得分:2)

根据我的意见,当你知道字符的长度时,VARCHAR是最好的选择。它还将减少垃圾内存分配和空间问题。 TEXT将消耗255,而VARCHAR将消耗,因为你给它赋值。

根据性能,VARCHAR也比TEXT快。

答案 8 :(得分:-5)

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