varchar字段-2的幂是否更有效?

62

使用2的幂次方作为varchar字段大小是否比其他数字更有效?我认为不是,因为对于SQL Server,默认值为50。

但是,我听说(但从未确认过)将字段大小定义为2的幂次方更有效,因为它们等同于偶数字节,计算机以位和字节为单位进行处理。

那么,声明为varchar(32)varchar(64)的字段是否比varchar(50)有任何实际好处?

5个回答

62
编号。

在某些其他用途中,使用大小为2的幂结构有一些优势,主要因为您可以将一个2的幂结构的数量放入另一个2的幂结构中。但这并不适用于DB字段大小。

与VARCHAR相关的唯一2的幂次是关于varchar(或一些SQL方言中的TEXT/BLOB)的确切类型:如果小于256,则可以使用单个字节指示长度。如果小于65536(64KB),两个字节就足够了,三个字节可达到16777216(16MB),四个字节可达到4294967296(4GB)。

此外,可以认为VARCHAR(50)VARCHAR(255)一样昂贵,因为两者都需要n + 1字节的存储空间。

当然在考虑Unicode之前...


39

我一直认为人们选择2的幂作为varchar字段的长度是因为我们都是极客,这就是我们所做的。至少这是我一直以来的做法。


我同意,但是你如何在用户界面中反映字符限制呢?对于普通用户来说,在文本字段旁边看到“n/1000”可能比看到“n/1024”更有意义。用户可能会问:“24是什么意思?” - akinuri
@akinuri,最近我使用Postgresql,这里没有理由限制varchar字段的长度 - 如果只有99个字符,则varchar(100)和varchar(1000000)字段占用相同的空间。 - Paul Tomblin

5

对于SQL的一般情况来说,不是的。但对于特定的实现方式,可能会有所不同。

什么更有效率并不由规范决定(SQL只是一种规范),而是由某个数据库管理系统中它的实现方式决定的。


这种情况可能发生的一个可能位置是行的内存格式中... 2^n长度应减少对齐偏移量的需求。通常只会有轻微影响,我猜测。 - dmckee --- ex-moderator kitten
1
内存对齐是以倍数而非幂次进行的。在32位对齐的架构中,最佳字节偏移量为4×n,例如。 - Juliano

4

使用某些最大长度只会带来实际的一个好处,那就是VARCHAR所需的存储空间。如果最大长度超过255,每行记录中存储该值的长度需要额外的1个字节(对于256^2或更高长度的数据,需要额外的2个字节以此类推)。


1
会不会是256*2呢? - Realn0whereman
@Realn0whereman 不需要,256*2 只需要额外的一位。8 位可以存储 0 到 255 的值(这里假设是无符号值),额外的一位将其加倍到 0-511。再加一个字节(8 位)将其扩展到 2^16 种可能的值,即 0-65535,即小于 256^2 的任何值。 - Tom Galvin

0

这取决于具体的数据库实现,但我不认为会影响性能。通常情况下,它不会对字符数量执行任何计算,因此它不应该影响性能,只会占用空间。


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