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

22 浏览
0 Comments

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

我看到一条评论:“如果在一个varchar(20)列中有5000万个值,长度在10到15个字符之间,而在一个varchar(50)列中有相同的5000万个值,它们所占的空间将完全相同。这就是varchar与char的区别所在。”有人能告诉我原因吗?请参阅“人名字段的合理长度限制是多少?”

0
0 Comments

在MySQL中,CHAR和VARCHAR是用于存储字符数据的数据类型。它们都需要指定一个长度来表示可以存储的最大字符数。然而,VARCHAR和CHAR在存储方式上有所不同。

根据MySQL官方文档,CHAR类型的值会被以固定长度的方式存储,无论实际存储的字符数是否达到了最大长度。而VARCHAR类型的值则会以变长方式存储,其存储方式包括一个字节或两个字节的长度前缀和实际数据。长度前缀用于指示数据的字节长度,如果值的长度不超过255字节,则使用一个字节的长度前缀,如果值的长度可能超过255字节,则使用两个字节的长度前缀。

需要注意的是,VARCHAR(255)和VARCHAR(256)是不同的。虽然它们的长度只相差1,但在存储时会使用不同长度的长度前缀。

根据habeebperwad的建议,实际上一个行的占用空间还取决于数据库引擎的页大小和硬盘块大小。这意味着在存储数据时,实际占用的空间可能与声明的数据类型长度不完全一致。

为了解决这个问题,可以采取以下方法之一:

- 使用合适的数据类型长度:根据实际需求和数据大小来选择合适的数据类型长度,避免使用不必要的大长度。

- 了解数据库引擎和硬盘配置:了解所使用的数据库引擎的页大小和硬盘块大小,以便更准确地估计数据的存储空间。

- 进行性能测试:在设计数据库表结构时,进行性能测试以评估不同数据类型和长度的存储空间和查询性能。

总结起来,VARCHAR(20)和VARCHAR(50)虽然都是用于存储字符数据的数据类型,但在存储方式和实际占用空间上存在差异。为了避免出现问题,需要根据实际需求选择合适的数据类型长度,并了解数据库引擎和硬盘配置的影响。

0
0 Comments

(varchar(20)和varchar(50)是一样的吗?)这个问题的出现的原因是人们认为在存储大量无用的填充空间时是浪费的,所以发明了VARCHAR。VARCHAR只占用与文本长度相同的空间。而如果是CHAR(50),无论数据有多短,它都将占用50个字节(或字符),通常是用空格填充。但是CHAR类型允许固定长度的记录,这在某些特殊用途的应用程序中可能很重要。关于varchar(20)和varchar(50)的区别,有人认为可能是在MySQL中存在一些数据块,对于小于32个字符的varchar,MySQL会分配32个字节,对于小于64个字符的varchar,会分配64个字节,以此类推。所以,varchar(33)和varchar(63)是相同的。 但是实际上,VARCHAR并不会按照这种逻辑来分配空间。VARCHAR类型的存储空间取决于实际存储的数据的长度,而不是定义的长度。

0
0 Comments

在MySQL中,有多种存储引擎可供选择,数据的物理存储取决于所选择的存储引擎。

对于MyISAM引擎,VARCHAR字段通常只占用实际字符串长度加上一两个字节的长度。这是因为MyISAM引擎只支持表级锁定而不支持行级锁定的设计限制所致。这样做的好处是缓存占用更小的空间,但是计算记录偏移量会更加复杂(更慢)。

实际上,MyISAM引擎提供了在整个表中根据列类型选择固定物理行大小和可变物理行大小表格式的选择。VARCHAR的存在只会改变默认方法,但是在同一表中存在TEXT blob时,VARCHAR也必须使用可变长度方法。

物理存储方法对于索引特别重要,这与表是不同的情况。MyISAM引擎对于CHAR和VARCHAR列都使用空间压缩,这意味着在这两种情况下,较短的数据在索引中占用的空间更少。

对于InnoDB引擎,与大多数其他当前的关系型数据库一样,使用了更复杂的机制。最大宽度小于768字节的VARCHAR列将在行内存储,并保留与最大宽度相匹配的空间。更详细的信息可以在这里找到:

对于每个非NULL的变长字段,记录头包含列的长度,长度可以使用一到两个字节表示。如果列的一部分存储在溢出页中或最大长度超过255字节且实际长度超过127字节,则需要使用两个字节。对于存储在外部的列,两个字节的长度表示内部存储部分的长度加上指向外部存储部分的20字节指针。内部部分为768字节,因此长度为768+20。20字节的指针存储列的真实长度。

目前,InnoDB在其索引中不进行空间压缩,这与上述MyISAM引擎的做法相反。

回到问题本身,上述所有内容只是一些实现细节,甚至可能在不同版本之间发生变化。CHAR和VARCHAR之间的真正区别是语义上的,VARCHAR(20)和VARCHAR(50)之间也是如此。通过确保无法将30个字符的字符串存储在VARCHAR(20)中,数据库使得不同的处理器和应用程序更容易进行集成,并能够以可预测的行为提供更好的解决方案。这才是重要的。

关于个人姓名,可以参考这个问题,它可能会给出一些实用的指导。无论如何,拥有超过70个UTF-8字符的全名的人都会遇到问题。

0