为什么历史上人们使用255而不是256来表示数据库字段的大小?

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

varchar(255) 

考虑到这是一个容量或大小, 而不是一个索引为什么255首选超过256? 是为了某种目的而保留的字节(终止符或null或其他)?

据推测,varchar(0)是废话(有零容量)? 在这种情况下,2 ^ 8的空间肯定是256?

还有其他的大小提供性能好处吗? 比如varchar(512)的性能比varchar(511)或varchar(510)less吗?

所有关系数据库的新旧值是否相同?

免责声明 – 我是一名开发人员而不是DBA,我使用适合业务逻辑的字段大小和types,但是我想知道这种偏好的历史原因,即使它不再相关更多,如果它仍然是相关的)。

编辑:

感谢你的回答,似乎有一个共识是,一个字节被用来存储大小,但这并不能解决这个问题。

如果元数据(string长度)存储在同一个连续的内存/磁盘中,这是有道理的。 1个字节的元数据和255个字节的string数据,可以很好地适应对方,适合256个连续的存储字节,大概整齐。

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

在这两种情况下,这似乎是一个微妙的,可能取决于数据库的实施。 使用255的做法似乎相当普遍,所以某个地方的某个人在开始的时候肯定有一个很好的例子,谁能记得那个案子是什么? 程序员不会没有理由地采取任何新的做法,这一定是新的一次。

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

长度为零的值肯定对varchar数据有效(除非另有限制)。 大多数系统将这种空string视为NULL,但某些系统(特别是Oracle)将空string视为NULL。 对于空string不为NULL的系统,需要在行的某个位置附加一个位来指示值是否应该被视为NULL。

如您所见,这是一个历史性的优化,可能与大多数系统无关。

255是mySQL4和更早版本中的varchar限制。

也是255个字符+空终止符= 256

或者1个字节的长度描述符给出一个可能的范围0-255个字符

255是可以存储在单字节无符号整数(假设为8位字节)中的最大数值 – 因此,为某种目的存储string长度的应用程序将优先select255而不是256,因为这意味着它们只需要为“大小”variables分配1个字节。

从MySQL手册:

数据types :
VARCHAR(M),VARBINARY(M)

需要储存:
如果列值需要0-255字节,则L + 1字节,如果值可能需要超过255字节,则L + 2字节

理解并做出select。

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

我认为这与老派程序员有关,甚至不记得我们为什么这样做。

varchars通常以pascalstring的forms实现:在字节#0中保存实际的长度。 因此该长度被限制为255.(一个字节的值从0到255变化)

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

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

<<

回想起存储位/字节的基本原理,它需要一个字节来存储低于256的整数,而两个字节存储256到65536之间的任何整数。因此,它需要相同的空间(两个字节)来存储511或512或者65535 ….因此,显然在上面的讨论中提到的这个论点对于varchar(512)或varchar(511)是N / A。

8位无符号= 256字节

长度为255个字符+字节0

它曾经是所有string都需要一个NUL终结符,或“反斜杠零”。 更新的数据库没有这个。 这是“文本的255个字符”,最后自动加上“\ 0”,这样系统就知道string结束了。 如果你说的是VARCHAR(256),那么最终将是257,然后你将在下一个注册的一个字符。 浪费的。 这就是为什么一切都是VARCHAR(255)和VARCHAR(31)。 出于习惯,255似乎陷入了僵局,但是31岁变成了32岁,而511岁变成了512岁。 那部分很奇怪。 很难让自己写VARCHAR(256)。

我认为这可能会回答你的问题。 看起来这是早期系统中varchar的最大限制。 我把它从另一个stackoverflow问题。

当然,很难知道最长的邮政地址是什么,这就是为什么许多人select一个比任何地址长的VARCHAR。 255是习惯性的,因为它可能是在某些数据库中的最大时间(以及PostgreSQL,直到最近)VARCHAR的最大长度。

对所有基于文本的字段使用genericsvarchar(255)是否有缺点?

数据以二进制forms保存在内存中,0和1是二进制数字。 可容纳1个字节(8位)的最大二进制数是11111111,它将转换为十进制数255。

    Interesting Posts