【问题标题】:VARCHAR vs TEXT in MySQLMySQL 中的 VARCHAR 与 TEXT
【发布时间】:2011-09-18 06:40:11
【问题描述】:

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

我应该使用哪些数据类型,TEXTVARCHAR?为什么?

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

我的理由是我应该使用VARCHAR 作为摘录,因为我可以分配一个大小限制,而TEXT 用于description 字段,因为它更大。

【问题讨论】:

标签: mysql database datafield


【解决方案1】:

VARCHAR 的存储方式与 InnoDB 中的 TEXT/BLOB 字段的存储方式相同(我假设您将其用于事务性、引用完整性和崩溃恢复,对吧?) - 那是,在磁盘上的其余表的外部(可能需要另一个磁盘读取来检索)。

从存储准 BLOB、TEXT 为 以及只要 VARCHAR 处理相同 通过 Innodb 的方式。这就是为什么 Innodb 手册称它为“长列”而不是 比 BLOB。

source

除非您需要索引这些列(在这种情况下,VARCHAR 更快)没有理由使用 VARCHAR 而不是 TEXT 用于长字段 - MySQL 中有一些特定于引擎的优化来调整根据长度检索数据,您应该使用正确的列类型来利用这些。

如果您使用的是MyISAM,则有关该主题的深入讨论是here

【讨论】:

  • @Andy,这很有趣,因为根据上面的 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
  • @Andy,谢谢。我不知道。所以如果我想使用全文索引来允许我的用户搜索description 字段,我必须将我的表转换为MyISAM?另外,如果我理解正确,LONG VARCHAR 或以上255 字符的行为方式与TEXTBLOB 相同?
  • 表格转换有其自身的缺点。将description 字段规范化为它自己的MyISAM 表并加入它将允许同时使用InnoDB 的强大功能和MyISAM 的单一理想功能:)
  • @Andy,有趣的方法。这么多要考虑。直到大约 15 分钟前,一切都很简单! :) 谢谢!
【解决方案2】:

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

@Andy 是正确的,InnoDB 在内部以相同的方式存储 VARCHARTEXT

FULLTEXT 索引在VARCHARTEXT 上均受支持。在 5.6 之前,您必须使用 MyISAM 来获取该类型的索引。在 MySQL 5.6 中,它终于在 InnoDB 中支持FULLTEXT。虽然你应该仔细测试它,因为它似乎比在 MyISAM 中的实现 return different results

但是,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

【讨论】:

    【解决方案3】:

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

    Varchar 数据存储在每一行中。文本数据以 Blob 形式存储在表之外。

    根据this test,varchar 的速度大约是 text 的三倍。

    【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2011-01-06
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2022-01-05
    • 2017-10-28
    相关资源
    最近更新 更多