关于数据库:MySQL中的VARCHAR vs TEXT

VARCHAR vs TEXT in MySQL

我有两个字段:一个用于存储最大大小为500个字符的excerpt,另一个用于存储最大大小为10000个字符的description

我应该使用什么数据类型,TEXTVARCHAR?为什么?

在mysql 5.0.3之后,varchar接受大约65000个字符。但这并不能说明我为什么要使用一种或另一种类型。

我认为我应该使用VARCHAR作为摘录,因为我可以指定大小限制,而TEXT作为description字段,因为它更大。


一个长的VARCHAR以与InnoDB中的TEXT/BLOB字段相同的方式存储(我假设您使用该字段进行交易性、参照完整性和崩溃恢复,对吗?)-也就是说,在磁盘上表的其余部分的外部(可能需要另一个磁盘读取来检索)。

From storage prospective BLOB, TEXT as
well as long VARCHAR are handled same
way by Innodb. This is why Innodb
manual calls it"long columns" rather
than BLOBs.

来源

除非需要索引这些列(在这种情况下,VARCHAR快得多),否则没有理由对长字段使用VARCHAR而不是TEXTMySQL中有一些特定于引擎的优化,可以根据长度调整数据检索,并且应该使用正确的列类型来利用这些优化。

如果您使用的是MyISAM,这里将对这个主题进行深入的讨论。


VARCHARTEXT之间的一个区别是,您可以为VARCHAR列声明DEFAULT子句,但不能为TEXT列声明。

@安迪认为InnoDB内部存储VARCHARTEXT的方式相同是正确的。

FULLTEXT索引在VARCHARTEXT上都受支持。在5.6之前,必须使用myisam获取该类型的索引。在MySQL5.6中,它最终支持InnoDB中的FULLTEXT。尽管您应该仔细测试它,因为它返回的结果似乎与myisam中的实现不同。

然而,与MySQL中的任何一种实现相比,sphinx搜索在功能上更快、更丰富。在全文搜索限制中查看我的概述。

@穆罕默德问:

when does VARCHAR become considered LONG VARCHAR? Is there a character threshold?

如果声明的长度最多为255个字节,则可以使用一个字节对给定字符串的长度进行编码。如果声明列的最大长度超过255个字节,则将使用两个字节对长度进行编码。

您可以将列声明为LONG VARCHAR,但这实际上只是MediumText的别名。

1
2
3
4
5
6
7
mysql> create table test ( l long varchar);

mysql> show create table test\G

CREATE TABLE `test` (
  `l` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=latin1


如果内容适合varchar列,则使用varchar。

varchar数据存储在每一行中。文本数据在表外存储为blob。

根据这个测试,varchar比文本快三倍。