fir*_*000 5 mysql database string varchar
我理解和之间的区别char,varchar但我不确定varchar最大长度的确切含义.
当我们存储string长度小于10时,varchar(10)和之间有什么区别varchar(100)?
我认为两种情况都使用相同的空间并具有相同的性能.如果是这样,为什么我们需要varchar max limit?
只使用" varchar"代替" varchar(xxx)" 是否足够?
(补充)我正在使用MySQL 5.0.67
这完全取决于所使用的DBMS引擎.SQL本身并没有强制要求物理存储的方式,而是逻辑上如何存储它们.
例如,您的DBMS可以在行中分配最大大小的空间,以及一些额外的字节来存储长度.在这种情况下,两者之间会有很大的差异varchar(10),varchar(1000)因为每行会浪费相当多的空间.
或者,它可以使用缓冲池来varchar存储数据并仅存储行中的长度和缓冲池"起始地址".在这种情况下,每一行都会为varchar列存储大小相同的信息,而不管其大小如何,但是会有一个额外的步骤来提取该列中的实际数据(在链接到缓冲池之后).
你使用a的原因varchar正是它命名的原因varchar.它允许您存储可变大小的数据元素.通常情况下,char(10)如果您插入较短的内容,则为您提供十个字符,无论如何,用空格填充它.您可以修剪掉尾随你解压缩空间,但不会这么好,如果你想存储的数据实际上是"hello ",与你想保留尾随空间.
一个不错的DBMS引擎可能决定根据varchar列的最大大小进行权衡.对于简短的,它可以将其内联存储在行中并消耗大小的额外字节.
较长的varchar列可以"外包"到单独的缓冲池,以确保行读取保持有效(至少在您需要大varchar列之前).
您需要做的是重新询问您的特定DBMS的问题,以便获得更有针对性的答案.
或者,说实话,设计您的数据库只存储最大尺寸.如果你知道它是10,那就varchar(1000)浪费了.如果将来需要扩大专栏,那就是时候了,而不是现在(参见YAGNI).
对于MySQL,您需要查看Chapter 14 Storage Engines在线文档.
它涵盖了MySQL使用的各种存储引擎(如InnoDB和MyISAM),并且看起来足够深入,您可以看到信息的物理存储方式.
例如,在MyISAM中,表(varchar包括)中存在可变长度数据通常意味着动态表.这遵循大致类似于上面提到的缓冲池概念的方案,其优点是对于可变大小的列浪费的空间更少,并且行可能变得碎片化的缺点.
另一种存储格式(折扣压缩格式,因为它仅用于只读表)是静态格式,其中数据存储在单个物理行中.
有关InnoDB物理结构的信息可以在这里找到.根据您使用的是Antelope还是Barracuda文件格式,您最终会得到"所有信息是物理行"或"缓冲池"的情况,类似于MyISAM动态和静态之间的区别.