据我所知,2,4,8,16,32,64,128,256 ...是二进制数字的十进制等值。
有没有理由将这些用于数据库?例如,VARCHAR字段通常为255个字符。由于(我假设)每个字符都是一个字节,为什么使用255个字符和使用257个字符有区别?
答案 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的幂。