VARCHAR(n)和VARCHAR(2^n)相比有什么优势吗?

3
我看到有些开发者将字段设置为 VARCHAR(50) / VARCHAR(100),而其他开发者则将字段设置为 VARCHAR(64) / VARCHAR(128) / VARCHAR(256)
除了个人偏好之外,使用2的n次方的数字来指定VARCHAR字段长度,与使用一个圆整数有何不同呢?假设这两个字段长度都可以支持传入的数据。

许多计算机专业人士认为128或256等数字是“圆整的数”。 - Damien_The_Unbeliever
1
作为程序员的迷信,使用2的幂次方可能会更好地对齐内存或磁盘。这并不是真的,但大多数人仍然这样做。 - apokryfos
它更符合计算机体系结构的字长,因此可能会使其在相同的计算成本下稍微更有效率/存储更多数据。 - Aiden Grossman
2
理想情况下,您既不选择 10n 也不选择 2^n,而是研究数据类型并选择适合存储的数据类型大小 - 例如,如果有适用于数据类型的法律或标准,则选择与标准相匹配的大小。 - Damien_The_Unbeliever
事实上,如果与非变长类型一起使用,2的幂次方迷信会变得积极有害,因为SQL Server关心的是数据的“页”(或最坏情况下“行”),而不是单个列是否具有某种“好的圆整大小”。因此,这可能会导致过度分配(从而产生额外的I/O),而对齐等方面则没有任何作用。理论上,您可以仔细地将整个行对齐;但实际上,这需要超自然的设计技能和纪律,同时考虑到诸如null位图之类的因素。让引擎处理那些东西。 - Jeroen Mostert
显示剩余3条评论
1个回答

1
没有优劣之分,这个数字只是定义存储字符串的最大长度。

1
我不同意没有任何缺点。列的长度是一种隐式约束。通过向上取整,您正在放宽可能对数据完整性产生影响的约束条件。例如,假设有一个用于保存美国邮政编码的列。由于它可以是5或10个字符,varchar(10)是有意义的。但是,如果您“向上取整”到最接近的2的幂,则会得到varchar(16)。现在,您可以添加多达16个字符的任何内容。介于11和16个字符之间的任何内容都是无效的,并且应该被拒绝存储在数据库中。 - Ben Thul
本,你当然是正确的,如果你知道该列应该有多长,那么设置一个合理的最大长度是有意义的。但是这篇文章问的是例如VARCHAR(100)与VARCHAR(128)之间的比较,所以可以相对安全地假设这些列已经设置为“安全”长度,以防止截断错误等情况发生。 - MJH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接