Mysql 当我们存储长度小于10的字符串时,varchar(10)和varchar(1000)之间有什么区别吗?

Mysql 当我们存储长度小于10的字符串时,varchar(10)和varchar(1000)之间有什么区别吗?,mysql,database,string,varchar,Mysql,Database,String,Varchar,我理解char和varchar之间的区别,但我不确定varchar最大长度的确切含义 当我们存储长度小于10的字符串时,varchar(10)和varchar(100)之间有什么区别吗 我认为这两种情况使用相同的空间,并具有相同的性能。如果是,为什么我们需要varchar max limit 仅仅使用“varchar”而不是“varchar(xxx)”就足够了吗 (补充)我使用的是MySQL 5.0.67,这完全取决于所使用的DBMS引擎。SQL本身并不要求物理上如何存储事物,只要求逻辑上如何看

我理解
char
varchar
之间的区别,但我不确定varchar最大长度的确切含义

当我们存储长度小于10的
字符串时,
varchar(10)
varchar(100)
之间有什么区别吗

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

仅仅使用“
varchar
”而不是“
varchar(xxx)
”就足够了吗


(补充)我使用的是MySQL 5.0.67,这完全取决于所使用的DBMS引擎。SQL本身并不要求物理上如何存储事物,只要求逻辑上如何看待事物

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

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

使用
varchar
的原因正是它被命名为
varchar
的原因。它允许您存储可变大小的数据元素。通常,
char(10)
会为您提供十个字符,如果您插入较短的字符,则不管怎样,都会在其中填充空格。您可以在提取尾随空间时修剪尾随空间,但如果您要存储的数据实际上是
“hello”
,并且要保留尾随空间,则这将无法很好地工作

一个好的DBMS引擎可能会根据
varchar
列的最大大小做出权衡。简而言之,它可以直接将其内联存储在行中,并消耗额外的字节来表示大小

较长的
varchar
列可以“外包”到单独的缓冲池中,以确保行读取保持高效(至少在您需要较大的
varchar
列之前)

您需要做的是针对您的特定DBMS重新询问问题,以便获得更有针对性的答案

或者,老实说,将数据库设计为只存储最大大小。如果你知道它是10,那么
varchar(1000)
就是浪费。如果将来需要放大该列,那么现在是时候了,而不是现在(请参阅)


对于MySQL,您需要查看在线文档的详细信息

它涵盖了MySQL使用的各种存储引擎(如InnoDB和MyISAM),深入观察,您可以看到信息是如何物理存储的

例如,在MyISAM中,表中存在可变长度数据(
varchar
include)通常意味着。这遵循了一个大致类似于我上面提到的缓冲池概念的方案,其优点是为可变大小的列浪费的空间更少,缺点是行可能变得支离破碎

另一种存储格式(不考虑压缩格式,因为它实际上只用于只读表)是,其中数据存储在单个物理行中


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

在Oracle中,Varchar的大小取决于其使用情况,刚好达到设置限制的位置。这意味着,实际上,包含2个字符的varchar(10)和varchar(100)使用相同的空间(对于总是使用完整分配空间的字符而言,这是不同的)。

在SQL Server中,该限制不会影响数据在磁盘上的存储方式。不过,它确实提供了一个免费的约束。作为数据库设计者,如果您最多只想存储10个字符,那么您就阻止了其他人存储小说

仅仅使用“varchar”就足够了吗


再说一次,因为,几乎肯定不是你想要的。在大多数情况下,如果不指定限制,就会得到一个
varchar(1)
(肯定是有史以来最无意义的数据类型)。有时,它是一个
varchar(30)

可能取决于您使用的产品。请为特定的RDBMS产品添加标签。我正在使用MySQL,但paxdiablo的答案对我来说已经足够了。无论如何,我添加了MySQL标签