MySQL中的VARCHAR与TEXT

时间:2011-06-19 19:27:27

标签: mysql database datafield

我有两个字段:一个用于存储excerpt,最大值为500个字符,另一个用于存储description,最大值为10,000个字符。

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

MySQL 5.0.3之后VARCHAR接受~65000个字符。但这并没有说明为什么我应该使用一种类型或另一种类型。

我推断我应该使用VARCHAR作为摘录,因为我可以为TEXT字段分配大小限制description,因为它更大。

3 个答案:

答案 0 :(得分:14)

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

  

从存储预期BLOB,TEXT为   以及长VARCHAR处理相同   Innodb的方式。这就是Innodb的原因   手动称它为“长列”而非   比BLOBs。

source

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

如果您正在使用MyISAM,则有关此主题的深入讨论为here

答案 1 :(得分:6)

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

@Andy是正确的,InnoDB在内部以相同的方式存储VARCHARTEXT

FULLTEXTVARCHAR都支持

TEXT个索引。在5.6之前,您必须使用MyISAM来获取该类型的索引。在MySQL 5.6中,它最终支持InnoDB中的FULLTEXT。虽然你应该仔细测试,因为它似乎return different results而不是MyISAM中的实现。

然而,Sphinx Search比MySQL中的任何一种实现更快,更丰富。请参阅Full-Text Search Throwdown中的概述。

@Mohammed问道:

  

何时VARCHAR被视为LONG VARCHAR?有人物门槛吗?

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

您可以将列声明为LONG VARCHAR,但这只是MEDIUMTEXT的别名。

mysql> create table test ( l long varchar);

mysql> show create table test\G

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

答案 2 :(得分:3)

如果您的内容适合varchar列,请使用varchar。

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

根据this test,varchar比文本快三倍。