varchar(20)和varchar(50)是一样的吗?

时间:2012-06-21 06:00:13

标签: mysql varchar

我看到评论“如果你在varchar(20)列中有10到15个字符之间的5000万个值,并且在varchar(50)列中有相同的5000万个值,它们将占用完全相同的空间。这是varchar的全部意义,而不是char。“任何人都可以告诉我原因吗?见What is a reasonable length limit on person "Name" fields?

3 个答案:

答案 0 :(得分:8)

MySQL提供了多种存储引擎选择。数据的物理存储取决于存储引擎。

我的VARCHAR存储空间

在MyISAM中,VARCHAR通常只占用字符串的实际长度加上一个或两个长度的字节。通过MyISAM对表锁定的设计限制而不是行锁定功能,这是实用的。性能结果包括更紧凑的缓存配置文件,但也包括更复杂(更慢)的记录偏移计算。

(实际上,MyISAM根据整个表中出现的列类型,在固定物理行大小和可变物理行大小表格式之间提供a degree of choiceVARCHAR的出现仅更改默认方法,但是同一个表中TEXT blob 强制 VARCHAR的存在也使用了可变长度方法。)

物理存储方法对于索引尤为重要,索引与表格不同。 MyISAM对 {/ em> CHARVARCHAR列使用空间压缩,这意味着在两种情况下,较短的数据占据索引中较少的空间。

VARCHAR的InnoDB存储

与大多数其他当前的关系数据库一样,InnoDB使用更复杂的机制。最大宽度小于768字节的VARCHAR列将以内联方式存储,其中房间保留与最大宽度匹配。更准确here

  

对于每个非NULL可变长度字段,记录头包含   一列或两个字节的列长度。只有两个字节   如果列的一部分存储在溢出页面或外部的外部,则需要   最大长度超过255个字节,实际长度超过127个   字节。对于外部存储的列,双字节长度表示   内部存储部分的长度加上20字节指针   外部存储的部分。内部部分是768字节,所以   长度是768 + 20。 20字节指针存储的真实长度   列。

InnoDB目前不在其索引中进行空间压缩,与MyISAM相反,如上所述。

回到问题

然而,上述所有内容只是一个实现细节,甚至可能在不同版本之间发生变化。 CHARVARCHAR之间的真正差异是语义,VARCHAR(20)VARCHAR(50)之间也是如此。通过确保无法在VARCHAR(20)中存储30个字符的字符串,数据库可以使各种处理器和应用程序的生活更轻松,更好地定义,它可以集成到可预测的行为解决方案中。这是一件大事。

具体而言,this question可能会为您提供一些实用指导。全名超过70个UTF-8字符的人无论如何都会遇到麻烦。

答案 1 :(得分:3)

是的,这确实是VARCHAR的重点。它只占用文本很长的空间。

如果你有CHAR(50),无论数据有多短(它都会被填充,通常用空格填充),它将占用50个字节(或字符)。

  

任何人都可以告诉我原因吗?

因为人们认为存储大量无用的填充物是浪费的,所以他们发明了VARCHAR。

答案 2 :(得分:2)

The manual州:

  

CHAR和VARCHAR类型的声明长度表示您要存储的最大字符数。 (...)

     

与CHAR相比,VARCHAR值存储为一个字节或两个字节长度的前缀加数据。长度前缀表示值中的字节数。如果值不超过255个字节,则列使用一个长度字节;如果值可能需要超过255个字节,则列使用两个长度字节。

请注意,VARCHAR(255)与VARCHAR(256)相同。

这是理论。正如habeebperwad所建议的那样,一个的实际占用空间取决于(引擎)页面大小和(硬盘)块大小。