MySQL中VARCHAR和TEXT之间的差异[重复]

这个问题在这里已经有答案了
MySQL中的VARCHAR与TEXT

(3个答案)

去年关闭了

当我们在MySQL中创建一个带有VARCHAR列的表时,我们必须为它设置长度。但是对于文本类型,我们不必提供长度

VARCHARTEXT之间有什么区别

TL;博士

文本

  • 固定了65535个字符的最大大小(不能限制最大大小)
  • 获取2+c字节的磁盘空间,其中c是存储字符串的长度
  • 不能(完全)成为索引的一部分。需要指定前缀长度

VARCHAR(M)

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

更多细节

TEXT最大大小固定为2⁶-1=65535个字符。
VARCHAR有一个变量最大大小MM=2⁶-1
因此,您不能选择文本的大小,但可以选择VARCHAR的大小

另一个区别是,不能在TEXT列上放置索引(全文索引除外)。
因此,如果要在列上建立索引,必须使用VARCHAR。但请注意,索引的长度也是有限的,因此如果VARCHAR列太长,则必须仅使用索引中VARCHAR列的前几个字符(请参阅创建索引的文档)

但是,如果您知道可能输入字符串的最大长度仅为M,例如电话号码或姓名或类似的内容,则还需要使用VARCHAR。然后,您可以使用VARCHAR(30)代替TINYTEXTTEXT,如果有人试图在您的电话号码列中保存所有三本“魔戒”书籍的文本,您只存储前30个字符:)

编辑:如果要存储在数据库中的文本长度超过65535个字符,则必须选择MEDIUMTEXTLONGTEXT,但要小心:MEDIUMTEXT最多存储16MB的字符串,LONGTEXT最多存储4GB的字符串。如果您使用LONGTEXT并通过PHP获取数据(至少如果您使用mysqli而不使用store\u result),则可能会出现内存分配错误,因为PHP试图分配4GB内存以确保整个字符串都可以缓冲。这可能在PHP以外的其他语言中也会发生

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

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

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

最后,我想添加一个通知,TEXTVARCHAR都是可变长度的数据类型,因此它们很可能会最小化存储数据所需的空间。但这需要对性能进行权衡。如果需要更好的性能,则必须使用固定长度的类型,如CHAR。你可以在这里了解更多

发表评论