2013-04-24 118 views
2

我了解charvarchar之间的区别,但我不确定varchar的最大长度为的确切含义。当我们存储长度小于10的字符串时,varchar(10)和varchar(1000)之间是否有区别?

当我们存储长度小于10的string时,varchar(10)varchar(100)之间是否有区别?

我认为这两种情况下使用相同的空间,并具有相同的性能。如果是这样,为什么我们需要varchar max limit?

使用“varchar”而不是“varchar(xxx)”就足够了吗?我使用MySQL 5.0.67

+0

可能取决于您正在使用的产品。请为特定的RDBMS产品添加标签。 – 2013-04-24 06:25:43

+0

我使用的是MySQL,但paxdiablo的答案对我来说已经足够了。无论如何,我已经添加了MySQL标签 – firia2000 2013-04-25 02:45:25

回答

5

这完全取决于正在使用的DBMS引擎。 SQL本身并没有规定物理存储的方式,只是逻辑上看它们的方式。

例如,您的DBMS可能会在最大大小的行中分配空间,再加上一些额外的字节来存储长度。在这种情况下,varchar(10)varchar(1000)之间会有很大的差异,因为您会浪费相当多的每行空间。

或者,它可能为varchar数据使用缓冲池,并且只存储行中的长度和缓冲池“起始地址”。在这种情况下,无论数据大小如何,每一行都会存储相同大小的信息,但是会增加一个步骤来提取该列中的实际数据(在连接到缓冲池之后)。

您使用varchar的原因恰恰就是它名为varchar的原因。它允许您存储可变大小的数据元素。通常,char(10)会为您提供十个字符,无论如何,如果插入较短的内容,请用空格填充它。您可以在提取时删除尾随空格,但如果要存储的数据实际上是"hello ",要保留的尾随空格,那么效果不佳。

一个体面的DBMS引擎可能决定取决于varchar列的最大大小进行权衡。简而言之,它可以将其直接存储在行中,并占用大小的额外字节。

更长varchar列可以被“外包”给一个单独的缓冲池,以确保行读数保持有效的(至少在您需要varchar列,反正)。

你需要做的是重新问你的具体DBMS的问题,以获得更有针对性的答案。

或者,诚实地说,设计你的数据库只存储最大尺寸。如果你知道它是10,那么varchar(1000)是浪费。如果将来您需要放大色谱柱,是该做的时间,而不是现在(见YAGNI)。


对于MySQL,您需要查看在线文档的Chapter 14 Storage Engines。它涵盖了MySQL使用的各种存储引擎(如InnoDB和MyISAM),并且看起来足够深入,可以看到信息是如何物理存储的。

例如,在MyISAM中,表中存在可变长度数据(包括varchar)通常表示dynamic tables。这遵循了与上面提到的缓冲池概念大致类似的方案,其优点是可变大小的列浪费的空间更少,以及行可能变得分散的缺点。

其他存储格式(折扣压缩格式,因为它只用于只读表格)是static one,其中数据存储在单个物理行中。

关于InnoDB物理结构的信息可以在here找到。根据您使用的是Antelope还是Barracuda文件格式,最终会出现“所有信息都是物理行”或“缓冲池”的情况,类似于MyISAM的动态和静态区分。

0

在Oracle中,Varchar的大小取决于它的用途,直到您设置限制的点。这意味着实际上,包含2个字符的varchar(10)和varchar(100)使用相同的空间(对于始终使用完整分配空间的char,这是不同的)。

1

在SQL Server中,限制不会影响数据在磁盘上的存储方式。但它所提供的是免费的一个约束。如果你作为数据库设计师只想存储多达10个字符,那么你就会阻止某人存储小说。

是否足够只使用 “VARCHAR”

再次,对于SQL Server,几乎可以肯定不是你想要的。在大多数情况下,如果你没有指定限制,你会得到一个varchar(1)(肯定是有史以来最无意义的数据类型)。偶尔,这是一个varchar(30)

相关问题