为什么数据库模式通常包含32,64,128等

时间:2012-02-23 02:47:06

标签: sql database binary byte

据我所知,2,4,8,16,32,64,128,256 ...是二进制数字的十进制等值。

有没有理由将这些用于数据库?例如,VARCHAR字段通常为255个字符。由于(我假设)每个字符都是一个字节,为什么使用255个字符和使用257个字符有区别?

4 个答案:

答案 0 :(得分:6)

对于varchar列, length 使用数据的前导字节中的无符号整数存储数据。使用最少的字节数;一个字节可以存储0到255之间的长度,0到65535之间的两个字节等。通过使长度为255,可以从最小的一个长度字节中获得“最大值”。

在过去的日子里,每行保存的单个字节磁盘值得保存。虽然现在磁盘价格便宜,但仍然存在这种想法,特别是白发苍苍的DBA。

选择2的幂的长度是没有优势的,例如varchar(64) - 它只是一个习惯/惯例(我甚至遵循它 - 我不知道为什么!)。< / p>

答案 1 :(得分:1)

不仅仅是数据库模式,而且几乎任何编程工件都会被发现包含许多数字的形式2 ^ N或2 ^ N-1。虽然这些用途中的一些是有意义的(例如,2 ^ 32-1是在许多机器架构中可表示为标准无符号整数的最大数字),但是大多数使用2的幂是不太必要的。在实践中,老黑客认为2的权力是神圣的,并且尊重他们。

答案 2 :(得分:1)

数据库中的数据通常以pages组织。这些页面几乎与内存和缓存管理的内存边界一致。为数据选择2 ^ n大小有利于优化数据库中空间的使用。

注意:根据RDBMS引擎,从内存对齐的角度来看,256可能不是可变长度字符串的最佳选择,因为字符串的长度也占用空间,即varchar(256)占用258字节。

答案 3 :(得分:1)

这比任何事情更习惯。关于varchar(32)或varchar(64)没有任何魔力,类似地,可视化工具尝试使用的默认值(例如varchar(50))没有什么神奇之处。很多这些上限已经深入到人们的脑海中,因为对于任何人来说640k就足够了,我们真的需要担心每一个字节。

在很多情况下,它归结为一个共同点。在以前的系统中,我在产品经理中不知道他们的要求是什么。他们想要存储一个名字,但是他们不知道名字的真正含义是什么 - 但其中一个人说他们听说过姓氏&gt; 50个字符,所以他知道它必须超过32个,超过50个。我们回来了64个,他同意这已经足够了,那就是AFAIK今天仍然存在的。

虽然我们确实有电子邮件的技术原因(varchar(320)),当时标准规定为320个字符,因为用户名/ localpart为64个字符,域名为255个字符,@为1个字符。大多数其他决策都基于优先级(例如,所有后续名称遵循上面确定的nvarchar(64)模型)或逻辑(例如URL不需要是nvarchar(max),但取决于标准和浏览器功能)时间,我相信varchar(2048)或varchar(4096)。在这种情况下,不是因为它是2的幂,而是因为其他人的软件或标准构建他们的东西使用2的幂。