当我们在mysql中用VARCHAR
列创建一个表时,我们必须为它设置长度。但是对于TEXT
类型,我们不必提供长度。
VARCHAR "和 "TEXT "之间有什么区别?
TEXT
c
字节的磁盘空间,其中c
是存储字符串的长度。varchar(m)
M
字符的变量c
字节(对于M
≤ 255)或2 + c
(对于256 ≤ M
≤ 65535)字节的磁盘空间,其中c
是存储字符串的长度TEXT
有一个固定的最大尺寸,即2¹⁶-1 = 65535
字符。
VARCHAR'有一个**可变的**最大尺寸
M',最高为*M=2¹⁶-1
。
所以你不能选择TEXT
的大小,但你可以选择VARCHAR
的大小。
另一个区别是,你不能在TEXT
列上放置索引(除了全文本索引)。
所以如果你想在这个列上有一个索引,你必须使用VARCHAR
。但是请注意,索引的长度也是有限制的,所以如果你的VARCHAR
列太长,你必须在索引中只使用VARCHAR
列的前几个字符(参见CREATE INDEX
的文档)。
但是你也想使用VARCHAR
,如果你知道可能的输入字符串的最大长度只有M
,例如一个电话号码或一个名字或类似的东西。那么你可以使用VARCHAR(30)
而不是TINYTEXT
或TEXT
,如果有人试图将三本"Lord of the Ring"书的文本保存在你的电话号码列中,你只保存前30个字符 :)
编辑:如果你想在数据库中存储的文本长于65535个字符,你必须选择MEDIUMTEXT
或LONGTEXT
,但要小心。MEDIUMTEXT
可以存储最大16MB的字符串,LONGTEXT
可以存储最大4GB。如果你使用LONGTEXT
并通过PHP获取数据(至少如果你使用mysqli
而不使用store_result
),你可能会得到一个内存分配错误,因为PHP试图分配4GB的内存以确保整个字符串可以被缓冲。这种情况也可能发生在PHP以外的其他语言中。
然而,你应该总是检查输入(是否太长? 是否包含奇怪的代码?
注意。对于这两种类型,所需的磁盘空间只取决于存储字符串的长度,而不取决于最大长度。
例如如果你使用latin1字符集,将文本"Test"存储在VARCHAR(30)
、VARCHAR(100)
和TINYTEXT
中,它总是需要5个字节(1个字节用于存储字符串的长度,1个字节用于每个字符)。如果你在VARCHAR(2000)
或TEXT
列中存储同样的文本,它也需要同样的空间,但是,在这种情况下,它将是6个字节(2个字节存储字符串的长度,1个字节存储每个字符)。
欲了解更多信息,请看文档。
最后,我想补充一点,TEXT'和
VARCHAR'都是可变长度的数据类型,所以它们很可能使你存储数据的空间最小化。但是这也是对性能的一种补偿。如果你需要更好的性能,你必须使用一个固定长度的类型,如CHAR
。你可以阅读更多关于这方面的内容这里。