在MySQL中创建表时,如果有VARCHAR
列,我们必须为其设置长度。但对于TEXT
类型,我们不需要提供长度。
VARCHAR
和TEXT
有什么区别?
TEXT
c
字节的磁盘空间,其中c
为存储字符串的长度。VARCHAR(M)
M
个字符M
的取值必须在1到65535之间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(30)
,VARCHAR(100)
和TINYTEXT
中存储文本“Test”,则始终需要5个字节(1个字节用于存储字符串长度和每个字符1个字节)。如果您将相同的文本存储在VARCHAR(2000)
或TEXT
列中,它也将占用相同的空间,但在这种情况下,它将是6个字节(2个字节用于存储字符串长度和每个字符1个字节)最后,我想指出一个注意事项,TEXT
和VARCHAR
都是可变长度数据类型,因此它们很可能会最小化存储数据所需的空间。但这也会带来性能上的折衷。如果您需要更好的性能,则必须使用固定长度类型,例如CHAR
。您可以在这里阅读更多信息。
VARCHAR
列的大小计入最大行大小,而TEXT
列被假定为通过引用存储其数据,因此只需要9-12字节。这意味着,即使您的VARCHAR
字段的“理论”最大大小为65535个字符,如果您的表中有多个列,则无法实现该大小。VARCHAR
字段所需的实际字节数取决于列的编码(和内容)。MySQL将使用向最大行大小使用的最大可能字节数进行计数,因此,如果您使用类似于utf8mb4
(几乎肯定应该使用)的多字节编码,它将使用更多的最大行大小。VARCHAR
/TEXT
字段数据是否实际存储在行中或通过引用存储取决于底层存储引擎。对于InnoDB,行格式影响此行为。(感谢Bill-Karwin)TEXT
的原因:
VARCHAR
的原因:
TEXT
相比VARCHAR
的优势是什么? - Solomon UckoCHAR
类型并不会提供任何显著的性能改善。(这种说法源于一个有关 MyISAM 表的陈旧传言,即使在那里也缺乏可靠性。) - Rick JamesTEXT
无法有默认值,而VARCHAR
可以。请参阅为什么MySQL中的文本列不能有默认值?- Stack Overflow。 - Peter V. Mørch