use*_*485 258 mysql varchar text
当我们在mysql中创建一个包含VARCHAR列的表时,我们必须为它设置长度.但对于TEXT类型我们不必提供长度.
VARCHAR和之间有什么区别TEXT?
Abc*_*hen 481
TEXT
c字节的磁盘空间,其中c是存储的字符串的长度.VARCHAR(M)
M字符数M 需要在1到65535之间c字节(对于M≤255)或2 + c(对于M256≤≤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如果有人试图在你的电话号码栏中保存所有三个"指环王"书籍的文本你只存储前30个字符:)
编辑:如果要存储在数据库中的文本长度超过65535个字符,则必须选择MEDIUMTEXT或LONGTEXT,但要小心:MEDIUMTEXT存储最大16 MB的字符串,LONGTEXT最多4 GB.如果您LONGTEXT通过PHP 使用并获取数据(至少如果您mysqli不使用store_result),则可能会出现内存分配错误,因为PHP会尝试分配4 GB内存以确保整个字符串可以缓冲.这可能也发生在除PHP以外的其他语言中.
但是,在将数据存储到数据库之前,您应该始终检查输入(它是否太长?它是否包含奇怪的代码?).
注意:对于这两种类型,所需的磁盘空间仅取决于存储的字符串的长度,而不取决于最大长度.
例如,如果您使用charset latin1并将文本"Test"存储在VARCHAR(30),VARCHAR(100)并且TINYTEXT,它总是需要5个字节(1个字节用于存储字符串的长度,1个字节用于每个字符).如果在a VARCHAR(2000)或TEXT列中存储相同的文本,它也需要相同的空间,但在这种情况下,它将是6个字节(2个字节用于存储字符串长度,1个字节用于每个字符).
有关更多信息,请查看文档.
最后,我想补充的通知,这两个,TEXT并且VARCHAR都是可变长度的数据类型,因此他们最有可能减少需要存储数据的空间.但这需要权衡性能.如果你需要更好的性能,你必须使用固定长度类型CHAR.你可以在这里阅读更多相关信息.
Cod*_*der 45
上面的答案中省略了一个重要的细节。
MySQL 对每行的最大大小施加了 65,535 字节的限制。VARCHAR列的大小计入最大行大小,而TEXT列被假定为通过引用存储其数据,因此它们只需要 9-12 个字节。这意味着即使您的VARCHAR字段的“理论”最大大小为 65,535 个字符,如果您的表中有一列以上,您将无法实现这一目标。
另请注意,VARCHAR字段所需的实际字节数取决于列(和内容)的编码。MySQL 将使用的最大可能字节数计入最大行大小,因此如果您使用多字节编码utf8mb4(您几乎肯定应该这样做),它将使用更多的最大行大小。
更正:无论MySQL如何计算最大行大小, VARCHAR/TEXT字段数据是实际存储在行中还是通过引用存储取决于您的底层存储引擎。对于 InnoDB,行格式会影响此行为。(感谢比尔-卡文)
使用理由TEXT:
使用理由VARCHAR:
| 归档时间: |
|
| 查看次数: |
180638 次 |
| 最近记录: |