在mysql中的VARCHAR和TEXT之间的差异
当我们用一个VARCHAR
列在mysql中创build一个表时,我们必须设置它的长度。 但对于TEXT
types,我们不必提供长度。
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。 你可以在这里阅读更多。