在mysql中的VARCHAR和TEXT之间的差异
当我们用一个VARCHAR列在mysql中创build一个表时,我们必须设置它的长度。 但对于TEXTtypes,我们不必提供长度。
VARCHAR和TEXT什么区别?
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)而不是TINYTEXT或TEXT ,如果有人试图在你的电话号码列中保存所有三个“魔戒”的文本,你只能存储前30个字符:)
编辑:如果要存储在数据库中的文本长度超过65535个字符,则必须selectMEDIUMTEXT或LONGTEXT ,但要小心: 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个字节)。
有关更多信息,请参阅文档 。
最后,我想添加一个通知,即TEXT和VARCHAR都是可变长度的数据types,所以它们很可能会最小化存储数据所需的空间。 但是这带来了性能的折衷。 如果您需要更好的性能,则必须使用CHAR等固定长度types。 你可以在这里阅读更多。