这完全取决于所使用的 DBMS 引擎。 SQL 本身并不规定事物如何物理存储,而只是规定它们如何逻辑地存储。
例如,您的 DBMS 可能会在行中分配最大大小的空间,再加上一些额外的字节来存储长度。那样的话,就会有很大的区别varchar(10)
and varchar(1000)
因为每行都会浪费相当多的空间。
或者,它可以使用缓冲池varchar
数据并仅存储行中的长度和缓冲池“起始地址”。在这种情况下,每一行都将存储相同大小的信息varchar
列,无论其大小如何,但都会有一个额外的步骤来提取该列中的实际数据(遵循到缓冲池的链接)。
您使用的原因varchar
这正是它被命名的原因varchar
。它允许您存储可变大小的数据元素。通常,char(10)
无论如何,都会给您十个字符,如果您插入更短的内容,则用空格填充它。您可以在提取数据时修剪掉尾随空格,但如果您要存储的数据实际上是"hello "
, with您想要保留的尾随空格。
一个好的 DBMS 引擎可能会根据数据库的最大大小进行权衡。varchar
柱子。对于短的,它可以将其内联存储在行中并消耗额外的字节大小。
Longer varchar
列可以“外包”到一个单独的缓冲池,以确保行读取保持高效(至少直到您need大的varchar
专栏,无论如何)。
您需要做的是针对您的特定 DBMS 重新提出问题,以获得更有针对性的答案。
或者,老实说,将数据库设计为仅存储最大大小。如果你知道是 10,那么varchar(1000)
是一种浪费。如果以后需要扩大栏目,that是时候做这件事了,而不是现在(参见YAGNI http://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it).
对于 MySQL,您需要查看Chapter 14 Storage Engines http://dev.mysql.com/doc/refman/5.7/en/storage-engines.html的在线文档。
它涵盖了 MySQL 使用的各种存储引擎(例如 InnoDB 和 MyISAM),并且深入观察,您可以看到信息是如何物理存储的。
例如,在 MyISAM 中,表中存在可变长度数据(varchar
包括)通常意味着动态表 http://dev.mysql.com/doc/refman/5.7/en/dynamic-format.html。这遵循的方案大致类似于我上面提到的缓冲池概念,优点是可变大小的列浪费的空间更少,缺点是行可能会碎片化。
另一种存储格式(不考虑压缩格式,因为它仅真正用于只读表)是静态一 http://dev.mysql.com/doc/refman/5.7/en/static-format.html,其中数据存储在单个物理行中。
有关InnoDB物理结构的信息可以找到here http://dev.mysql.com/doc/refman/5.7/en/innodb-table-and-index.html。根据您使用的是Antelope还是Barracuda文件格式,您最终会遇到“所有信息都是物理行”或“缓冲池”的情况,类似于MyISAM动态和静态的区别。