代码之家  ›  专栏  ›  技术社区  ›  Andrew M

为什么历史上人们使用255而不是256作为数据库字段震级?

  •  166
  • Andrew M  · 技术社区  · 14 年前

    您经常看到数据库字段的大小设置为255个字符,传统/历史原因是什么?我认为这与分页/内存限制和性能有关,但255和256之间的区别一直让我困惑。

    varchar(255)
    

    考虑到这是一种能力或规模, 不是索引器 , 为什么255优先于256? 一个字节是为了某种目的而保留的吗(终止符或null之类的)?

    可能varchar(0)是一个废话(容量为零)?在这种情况下,2^8的空间应该是256?

    是否还有其他的级别可以提供性能优势?例如,varchar(512)的性能是否低于varchar(511)或varchar(510)?

    对于所有关系数据库(旧数据库和新数据库),此值是否相同?

    免责声明 -我是一个开发人员,而不是一个dba,我使用的字段大小和类型适合于已知的业务逻辑,但是我想知道 有历史意义的 这种偏好的原因,即使它不再相关(但如果它仍然相关,则更重要)。

    编辑:

    感谢你的回答,似乎有一些人认为字节是用来存储大小的,但这并不能在我的脑海中解决问题。

    如果元数据(字符串长度)存储在同一个连续的内存/磁盘中,这就有一定的意义。1个字节的元数据和255个字节的字符串数据将非常适合彼此,并且可以容纳256个连续字节的存储,这大概是整洁的。

    但是…如果元数据(字符串长度)与实际字符串数据(可能在主表中)分开存储,那么将字符串数据的长度限制为一个字节,仅仅因为只存储一个1字节整数的元数据更容易,这似乎有点奇怪。

    在这两种情况下,这似乎是一个微妙的,可能取决于数据库实现。使用255的做法似乎相当普遍,所以某个地方的人在一开始肯定为它争论过一个很好的案例,有人记得那个案例是什么/是什么吗?程序员不会无缘无故地采用任何新的实践,而这一定是新的一次。

    12 回复  |  直到 8 年前
        1
  •  151
  •   Greg Hewgill    14 年前

    最大长度为255个字符,DBMS可以选择使用单个字节来指示字段中数据的长度。如果限制为256或更大,则需要两个字节。

    长度为零的值对于 varchar 数据(除非另有限制)。大多数系统将这样的空字符串视为与null不同,但有些系统(尤其是oracle)将空字符串视为null。对于空字符串不为空的系统,需要在行中的某个位置添加一个位,以指示是否应将该值视为空。

    正如您所注意到的,这是一个历史优化,可能与当今大多数系统无关。

        2
  •  30
  •   RedPandaCurios    14 年前

    255是 varchar limit in mySQL4 and earlier.

    还有255个字符+空终止符=256

    或1字节长度描述符提供0-255个字符的可能范围

        3
  •  17
  •   Amber    14 年前

    255是可以存储在单字节无符号整数(假设为8位字节)中的最大数值,因此,出于某种目的存储字符串长度的应用程序更喜欢255而不是256,因为这意味着它们只需要为“size”变量分配1个字节。

        4
  •  14
  •   Anil Shinde    11 年前

    来自MySQL手册:

    数据类型:
    varchar(m),varbinary(m)

    所需存储空间:
    如果列值需要0–255字节,则为l+1字节;如果值可能需要255字节以上,则为l+2字节

    理解并做出选择。

        5
  •  12
  •   remi bourgarel    14 年前

    255是8位整数的最大值:11111111=255。

        6
  •  7
  •   MarkJ    14 年前

    最大长度255允许数据库引擎仅使用1个字节来存储每个字段的长度。1字节的空间允许存储字符串长度的2^8=256个不同值,这是正确的。

    但是,如果允许字段存储零长度的文本字符串,则需要能够在长度中存储零。所以可以允许256个不同的长度值,从0开始:0-255。

        7
  •  6
  •   Vlad    14 年前

    通常,varchar被实现为pascal字符串:以字节0为单位保存实际长度。因此,长度被绑定到255。(字节的值从0到255不等。)

        8
  •  5
  •   Balaji Katika    10 年前

    <<

    回顾了位/字节存储的基本原理,它需要一个字节来存储256以下的整数,而对于256到65536之间的任何整数,则需要两个字节。 因此,它需要相同的空间(两个字节)来存储511或512或65535…. 因此很明显,上面讨论中提到的这个参数对于varchar(512)或varchar(511)是不适用的。

        9
  •  3
  •   gbn    14 年前

    8位无符号=256字节

    255个字符+字节0表示长度

        10
  •  3
  •   Greg    9 年前

    以前,所有字符串都需要一个nul终止符,或“反斜杠零”。更新的数据库没有这个功能。它是“255个字符的文本”,结尾自动添加“\0”,这样系统就知道字符串的结尾。如果你说varchar(256),那么它最终将是257,然后你将进入下一个字符的寄存器。浪费的这就是为什么一切都是varchar(255)和varchar(31)。出于习惯,255似乎一直存在,但31变成了32,511变成了512。这部分很奇怪。很难让我自己写varchar(256)。

        11
  •  0
  •   Community Egal    7 年前

    我想这也许能回答你的问题。看起来这是早期系统中varchar的最大限制。我把它从另一个stackoverflow问题中去掉了。

    当然,很难知道最长的邮政地址是什么,这就是为什么许多人选择一个比任何地址都长的长varchar。255是一种习惯,因为它可能是某些数据库在早期(以及直到最近的postgresql)中varchar的最大长度。

    Are there disadvantages to using a generic varchar(255) for all text-based fields?

        12
  •  0
  •   Ejaz    11 年前

    数据保存在二进制系统的存储器中,0和1是二进制数字。可以容纳1字节(8位)的最大二进制数是1111111,它可以转换为十进制255。