代码之家  ›  专栏  ›  技术社区  ›  Jon Winstanley

为什么SQL字段的长度总是(2^n)-1,除非小于127?

  •  6
  • Jon Winstanley  · 技术社区  · 15 年前

    许多数据库模式似乎遵循以下标准:

    (2 ^ n)- 1 对于大字段:

    varchar(511)
    varchar(255)
    varchar(127)
    

    然后…… (2 ^ n) 对于较小的

    varchar(64)
    varchar(32)
    varchar(16)
    varchar(8)
    

    我理解为什么使用(2^n)-1的数字,我不理解的是为什么没有必要将趋势向下延伸到小字段。

    例如。

    varchar(63)
    varchar(31)
    varchar(15)
    varchar(7)
    

    这是有原因的,还是仅仅是回报率下降得太远了?

    6 回复  |  直到 15 年前
        1
  •  4
  •   WegDamit    15 年前

    我记得以前,当使用2^n长度时,磁盘或内存块的VOR对齐更好。 对齐块更快。 如今,“块”的大小更大,内存和磁盘的速度足以忽略对齐, 适用于非常大的块。(无论今天“非常大”是什么意思…)

    现在这样做只是传统的。

    另一个原因是我的名言: 只有10种类型的人:那些能二进制的人和其他人。

    而2^n-1则是梅森素数的候选者。所以也很奇怪…

        2
  •  7
  •   jcoder    15 年前

    我认为这只是程序员在无关紧要的时候从空中挑选出一个数字。

    例如,如果必须对“notes”字段设置限制,非程序员可能会选择100或200个字符作为整数,而程序员可能会将127或255作为整数。

        3
  •  3
  •   Robin Day    15 年前

    我看不出“-1”的趋势在更小/更大的领域有不同的用法。不过,我认为这只不过是开发人员/DBA OCD。当他们真的应该根据业务规则而不是“漂亮”来决定字段长度时,总是希望得到“整数”。

        4
  •  2
  •   Jeff Davis    15 年前

    不仅使返回值减小,而且如果使用任意限制设置字符串类型,则很可能导致问题而不是解决问题。

    如果它真的是一个业务约束,那么在长度上使用文本类型(或类似的)和检查约束,并根据您试图实施的业务约束来选择数字。

    DBMS可能会实现与varchar(x)相同的文本类型存储。如果没有,而且您真的很在意,那么您应该调查特定系统的内部存储策略,并考虑是否对varchar有任何好处。

        5
  •  0
  •   Maximilian Mayerl    15 年前

    实际上,这是我第一次听说这种“趋势”。我的varchar字段总是和我需要的一样长。

    我想说这背后没有什么特别的原因。只是开发人员的偏好。

        6
  •  0
  •   Andrew    15 年前

    我暂时无法想象为什么它们会以2^n或2^n-1的方式调整字段大小。从SQL Server的角度来看,这听起来更像是对SQL如何在页面级别存储数据的误解,而不是特定的原因。

    我会更加关注类型、潜在的页外存储(slob/lob)和行/页+以大小调整来满足业务需求,而不是基于使用2^n等的公式。