我有两个字段:一个存储excerpt
最大大小为 500 个字符的 a,另一个存储description
最大大小为 10,000 个字符的 a。
我应该使用什么数据类型,TEXT
或者VARCHAR
?为什么?
MySQL 5.0.3 之后 VARCHAR 接受 ~65000 个字符。但这并不能说明为什么我应该使用一种或另一种。
我的理由是我应该使用VARCHAR
摘录,因为我可以分配大小限制,并且可以分配更大TEXT
的字段。description
long以与/字段VARCHAR
相同的方式存储(我假设您将其用于事务性、引用完整性和崩溃恢复,对吗?) - 也就是说,在磁盘上的其余表的外部(这可能需要另一个磁盘读取以检索)。TEXT
BLOB
InnoDB
Innodb 以相同的方式处理存储预期的 BLOB、TEXT 以及 long VARCHAR。这就是 Innodb 手册将其称为“长列”而不是 BLOB 的原因。
除非您需要索引这些列(在这种情况下VARCHAR
要快得多),否则没有理由对长字段使用VARCHAR
over TEXT
- 有一些引擎特定的优化MySQL
可以根据长度调整数据检索,您应该使用正确的列类型利用这些。
如果您正在使用MyISAM
关于该主题的深入讨论,请点击此处。
VARCHAR
和之间的一个区别TEXT
是您可以DEFAULT
为列声明子句VARCHAR
,但不能为TEXT
列声明。
@Andy 是正确的,InnoDB 在内部以相同的方式存储VARCHAR
两者TEXT
。
FULLTEXT
VARCHAR
和都支持索引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