42

我有两个字段:一个存储excerpt最大大小为 500 个字符的 a,另一个存储description最大大小为 10,000 个字符的 a。

我应该使用什么数据类型,TEXT或者VARCHAR?为什么?

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

我的理由是我应该使用VARCHAR摘录,因为我可以分配大小限制,并且可以分配更大TEXT的字段。description

4

3 回答 3

29

long以与/字段VARCHAR相同的方式存储(我假设您将其用于事务性、引用完整性和崩溃恢复,对吗?) - 也就是说,在磁盘上的其余表的外部(这可能需要另一个磁盘读取以检索)。TEXTBLOBInnoDB

Innodb 以相同的方式处理存储预期的 BLOB、TEXT 以及 long VARCHAR。这就是 Innodb 手册将其称为“长列”而不是 BLOB 的原因。

来源

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

如果您正在使用MyISAM关于该主题的深入讨论,请点击此处

于 2011-06-19T19:41:23.763 回答
9

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

@Andy 是正确的,InnoDB 在内部以相同的方式存储VARCHAR两者TEXT

FULLTEXTVARCHAR和都支持索引TEXT。在 5.6 之前,您必须使用 MyISAM 来获取该类型的索引。在 MySQL 5.6 中,它终于FULLTEXT在 InnoDB 中支持。尽管您应该仔细测试它,因为它似乎返回与MyISAM 中的实现不同的结果。

但是,Sphinx Search比 MySQL 中的任何实现都更快且功能更丰富。请参阅全文搜索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
于 2014-02-25T12:48:00.813 回答
5

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

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

根据这个测试,varchar 比 text 快大约三倍。

于 2011-06-19T19:32:59.020 回答