MySQL 中的 VARCHAR 与 TEXT
我有两个字段:一个用于存储最大长度为 500 个字符的摘录
,另一个用于存储最大长度为 10,000 个字符的描述
。
我应该使用什么数据类型,TEXT
还是 VARCHAR
?为什么?
MySQL 5.0.3 之后,VARCHAR 接受约 65000 个字符。但这并不能说明为什么我应该使用一种类型和/或另一种类型。
我认为我应该使用 VARCHAR
作为摘录,因为我可以指定大小限制,并使用 TEXT
作为 description
字段,因为它更大。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
长
VARCHAR
的存储方式与InnoDB
中TEXT
/BLOB
字段的存储方式相同(我假设您用于事务性、引用完整性和崩溃恢复,对吧?) - 也就是说,在磁盘上表的其余部分的外部(可能需要另一个磁盘读取来检索)。在
除非您需要对这些列建立索引( 在这种情况下
VARCHAR
速度要快得多),对于长字段,没有理由使用VARCHAR
而不是TEXT
- 有一些引擎特定的优化MySQL
根据长度调整数据检索,您应该使用正确的列类型来利用这些优势。如果您使用 MyISAM,有关该主题的深入讨论是 此处。
A long
VARCHAR
is stored in the same manner as aTEXT
/BLOB
field inInnoDB
(which I assume you're using for transactionality, referential integrity and crash recovery, right?) - that is, externally to the rest of the table on disk (which may require another disk read to retrieve).source
Unless you need to index these columns (in which case
VARCHAR
is much faster) there is no reason to useVARCHAR
overTEXT
for long fields - there are some engine specific optimisations inMySQL
to tune the data retrieval according to length, and you should use the correct column type to take advantage of these.In case you're using
MyISAM
an in-depth discussion on the topic is here.VARCHAR
和TEXT
之间的一个区别是,您可以为VARCHAR
列声明DEFAULT
子句,但不能为VARCHAR
列声明DEFAULT
子句。TEXT
列。@Andy 是正确的,InnoDB 在内部以相同的方式存储 VARCHAR 和 TEXT 。
VARCHAR
和TEXT
均支持FULLTEXT
索引。在5.6之前,必须使用MyISAM来获取该类型的索引。在MySQL 5.6中,它终于支持InnoDB中的FULLTEXT
。尽管您应该仔细测试它,因为它似乎 返回与 MyISAM 中的实现不同的结果。然而,Sphinx Search 比 MySQL 中的任一实现更快、功能更丰富。请参阅全文搜索抛出中的概述。
@穆罕默德问:
如果您声明的长度最多为 255 个字节,则它可以使用一个字节对给定字符串的长度进行编码。如果您声明列最大长度超过 255 个字节,它将使用两个字节来编码长度。
您可以将列声明为
LONG VARCHAR
,但这实际上只是中等文本。One difference between
VARCHAR
andTEXT
is that you can declare aDEFAULT
clause for aVARCHAR
column, but not for aTEXT
column.@Andy is correct that InnoDB stores both
VARCHAR
andTEXT
in the same way internally.FULLTEXT
indexes are supported on bothVARCHAR
andTEXT
. Prior to 5.6, you must use MyISAM to get that type of index. In MySQL 5.6, it finally supportsFULLTEXT
in InnoDB. Though you should test it carefully, because it seems to return different results than the implementation in MyISAM.However, Sphinx Search is faster and richer in features than either implementation in MySQL. See my overview in Full-Text Search Throwdown.
@Mohammed asked:
If you declare a length of up to 255 bytes, it can encode the length of a given string using one byte. If you declare the column max length over 255 bytes, it will use two bytes to encode the length.
You can declare a column as
LONG VARCHAR
, but this is really just an alias for MEDIUMTEXT.如果您的内容适合 varchar 列,则使用 varchar。
Varchar 数据存储在每一行中。文本数据作为 blob 存储在表外部。
根据此测试,varchar 比文本快大约三倍。
If your content fits in a varchar column then use varchar.
Varchar data is stored in each row. Text data is stored as blobs outside of the table.
According to this test, varchar is about three times faster than text.