我理解char和varchar之间的区别,但我不确定varchar最大长度的确切含义。
当我们存储长度小于10的string时,varchar(10)和varchar(100)之间有什么区别吗?
我认为这两种情况使用相同的空间和具有相同的性能。如果是的话,为什么我们需要varchar最大限度?
仅仅使用"varchar“而不是"varchar(xxx)”就足够了吗?
(添加)我使用的是MySQL 5.0.67
发布于 2013-04-24 06:27:17
这完全取决于所使用的DBMS引擎。SQL本身并没有强制要求事物是如何物理地存储的,而是如何逻辑地看待事物。
例如,DBMS可能会在行中为最大大小分配空间,加上一些额外的字节来存储长度。在这种情况下,varchar(10)和varchar(1000)之间会有很大的区别,因为每一行都会浪费相当多的空间。
或者,它可以对varchar数据使用缓冲池,并且只在行中存储长度和缓冲池“起始地址”。在这种情况下,每一行都会为一个varchar列存储相同大小的信息,而不管它的大小如何,但是将有一个额外的步骤来提取该列中的实际数据(按照到缓冲池的链接)。
使用varchar的原因正是它被命名为varchar的原因。它允许您存储可变大小的数据元素。通常情况下,如果您插入更短的内容,char(10)会给您十个字符,不管是什么,都会用空格填充它。您可以在提取数据时减少尾随空间,但是如果您想要存储的数据实际上是"hello "的话,这就不能很好地工作,并保留一个拖尾空间。
一个不错的DBMS引擎可能会根据varchar列的最大大小而决定进行权衡。简而言之,它可以将其内联存储在行中,并为大小消耗额外的字节。
可以将较长的varchar列“外包”到单独的缓冲池中,以确保行读取保持高效(至少在需要大型varchar列之前是如此)。
您需要做的是重新问您的特定DBMS的问题,以便得到一个更有针对性的答案。
或者,老实说,设计您的数据库,使其只存储最大的大小。如果你知道是10,那么varchar(1000)就是一种浪费。如果将来需要扩大列,那么就应该这样做,而不是现在(请参阅雅格尼)。
对于MySQL,您需要查看在线文档的Chapter 14 Storage Engines。
它涵盖了InnoDB使用的各种存储引擎(如MyISAM和MyISAM),如果看得足够深入,您可以看到信息是如何物理存储的。
例如,在MyISAM中,表中存在可变长度的数据(包括varchar)通常意味着动态表。这一方案大致类似于我前面提到的缓冲池概念,其优点是为可变大小的列浪费更少的空间,以及行可能变得支离破碎的缺点。
另一种存储格式(贴现压缩格式,因为它实际上只用于只读表)是静态的,其中数据存储在单个物理行中。
有关InnoDB物理结构的信息可以找到这里。取决于您是使用Antelope还是Barracuda文件格式,最终会出现“所有信息都是物理行”或“缓冲池”的情况,类似于动态和静态之间的MyISAM区别。
发布于 2013-04-24 06:28:35
在Server中,限制不影响数据如何存储在磁盘上。然而,它所提供的却是一个免费的制约因素。如果您作为数据库设计人员只想存储最多10个字符,那么您已经阻止了某人存储小说。
仅仅使用"varchar“就足够了吗?
同样,对于SQL Server来说,几乎肯定不是您想要的。在大多数情况下,如果您不指定一个限制,就会得到一个varchar(1) (无疑是有史以来最无意义的数据类型)。偶尔,它是一个varchar(30)。
发布于 2013-04-24 06:28:23
在Oracle中,where的大小取决于它的使用,直到设置限制的程度。这意味着,实际上,包含2个字符的varchar(10)和varchar(100)使用相同的空格(对于一个字符来说是不同的,它总是使用完全分配的空间)。
https://stackoverflow.com/questions/16184759
复制相似问题