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