在mysql中的VARCHAR和TEXT之间的差异

当我们用一个VARCHAR列在mysql中创build一个表时,我们必须设置它的长度。 但对于TEXTtypes,我们不必提供长度。

VARCHARTEXT什么区别?

TL; DR

TEXT

  • 固定的最大尺寸为65535个字符(不能限制最大尺寸)
  • 需要2 + c字节的磁盘空间,其中c是存储的string的长度。
  • 不能成为索引的一部分

VARCHAR(M)

  • M字符可变的最大尺寸
  • M需要在1到65535之间
  • 需要1 + c字节(对于M≤255)或2 + c (对于256≤M≤65535)字节的磁盘空间,其中c是存储的string的长度
  • 可以是索引的一部分

更多细节

TEXT固定最大尺寸为2¹⁶-1 = 65535字符。
VARCHAR具有可变的最大尺寸M 最高可达 M = 2¹⁶-1
所以你不能selectTEXT的大小,但你可以为VARCHAR

另一个区别是,你不能把一个索引(全文索引除外)放在一个TEXT列上。
所以如果你想在列上有一个索引,你必须使用VARCHAR 。 但请注意,索引的长度也是有限的,所以如果VARCHAR列太长,则只能使用索引中VARCHAR列的前几个字符(请参阅CREATE INDEX的文档)。

但是,如果您知道可能的inputstring的最大长度仅为M ,例如电话号码或名称或类似的内容,您也可以使用VARCHAR 。 那么你可以使用VARCHAR(30)而不是TINYTEXTTEXT ,如果有人试图在你的电话号码列中保存所有三个“魔戒”的文本,你只能存储前30个字符:)

编辑:如果要存储在数据库中的文本长度超过65535个字符,则必须selectMEDIUMTEXTLONGTEXT ,但要小心: MEDIUMTEXT存储的string最大为16 MB, LONGTEXT最大为4 GB。 如果您使用LONGTEXT并通过PHP获取数据(至less如果您使用mysqli没有store_result ),您可能会得到一个内存分配错误,因为PHP试图分配4 GB的内存,以确保整个string可以被缓冲。 这可能也发生在其他语言比PHP。

但是,在将数据存储到数据库之前 ,应该始终检查input(是否太长?是否包含奇怪的代码?)。

注意:对于这两种types,所需的磁盘空间仅取决于存储的string的长度,而不取决于最大长度。
例如,如果使用字符集latin1并在VARCHAR(30)VARCHAR(100)TINYTEXT存储文本“Test”,则总是需要5个字节(1个字节来存储string的长度和每个字符1个字节)。 如果将相同的文本存储在VARCHAR(2000)TEXT列中,则也需要相同的空间,但在这种情况下,它将是6个字节(每个字符需要2个字节来存储string长度和1个字节)。

有关更多信息,请参阅文档 。

最后,我想添加一个通知,即TEXTVARCHAR都是可变长度的数据types,所以它们很可能会最小化存储数据所需的空间。 但是这带来了性能的折衷。 如果您需要更好的性能,则必须使用CHAR等固定长度types。 你可以在这里阅读更多。