我有两个字段:一个用于存储最大大小为500个字符的excerpt,另一个用于存储最大大小为10000个字符的description。
我应该使用什么数据类型,TEXT或VARCHAR?为什么?
在mysql 5.0.3之后,varchar接受大约65000个字符。但这并不能说明我为什么要使用一种或另一种类型。
我认为我应该使用VARCHAR作为摘录,因为我可以指定大小限制,而TEXT作为description字段,因为它更大。
- 一份大学:大varchar MySQL vs.文本?
一个长的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而不是TEXT—MySQL中有一些特定于引擎的优化,可以根据长度调整数据检索,并且应该使用正确的列类型来利用这些优化。
如果您使用的是MyISAM,这里将对这个主题进行深入的讨论。
- @安迪,这很有趣,因为根据上面的idstam,您可以在varchar上进行全文索引。他引用了这篇文章,我还没读到:devarticles.com/c/a/mysql/…
- 对于MyISAM的两种列类型,仍然支持全文:Full-text indexes can be used only with MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
- "安迪,谢谢。我不知道。所以,如果我想使用全文索引来允许我的用户搜索description字段,我必须将我的表转换为MyISAM?另外,如果我理解正确的话,长的VARCHAR或以上的255字符会像TEXT和BLOB一样吗?
- 表转换有其自身的缺点。将description字段归一化为它自己的MyISAM表并将其连接,将允许同时使用InnoDB的健壮特性和MyISAM的单一理想特性。
- @安迪,有趣的方法。想得太多了。直到15分钟前一切都很简单!)谢谢你!
- @安迪,PS:什么时候把VARCHAR当作LONG VARCHAR?是否有字符阈值?
VARCHAR和TEXT之间的一个区别是,您可以为VARCHAR列声明DEFAULT子句,但不能为TEXT列声明。
@安迪认为InnoDB内部存储VARCHAR和TEXT的方式相同是正确的。
FULLTEXT索引在VARCHAR和TEXT上都受支持。在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的别名。
如果内容适合varchar列,则使用varchar。
varchar数据存储在每一行中。文本数据在表外存储为blob。
根据这个测试,varchar比文本快三倍。
- 有意思,谢谢你。varchar列能否为搜索目的建立全文索引?
- 是的,根据这个:devarticles.com/c/a/mysql/…