您经常会看到数据库字段设置为255个字符,传统/历史原因是什么?我认为它与分页/内存限制和性能有关,但255和256之间的区别总是让我感到困惑。
varchar(255)
考虑到这是容量或幅度,不是索引器,为什么255优先于256?是为某种目的保留的字节(终止符或null或其他) ?
据推测varchar(0)是无意义的(零容量)?在这种情况下,2 ^ 8的空间肯定应该是256?
是否有其他量级可以提供性能优势?例如,varchar(512)的性能低于varchar(511)或varchar(510)?
对于所有关系数据库,旧的和新的数据库是否相同?
免责声明 - 我是开发人员而不是DBA,我使用适合我的业务逻辑的字段大小和类型,但我想知道历史< / em>这种偏好的原因,即使它不再相关(但如果它仍然相关则更多)。
感谢您的回答,似乎有一些共识认为一个字节用于存储大小,但这并不能在我的脑海中明确解决问题。
如果元数据(字符串长度)存储在相同的连续内存/磁盘中,则有一定意义。 1个字节的元数据和255个字节的字符串数据非常适合彼此,并且适合256个连续的存储字节,这可能是整洁的。
但是......如果元数据(字符串长度)与实际字符串数据分开存储(也许在主表中),那么将字符串数据的长度约束一个字节,只是因为它更容易只存储一个字节1字节整数的元数据似乎有点奇怪。
在这两种情况下,它似乎都是一个微妙的可能取决于数据库的实现。使用255的做法似乎相当普遍,所以某个地方的人必须在一开始就为它辩护一个好的案例,有人能记住那个案例是什么吗?程序员在没有理由的情况下不会采用任何新的做法,这必须是新的一次。
答案 0 :(得分:154)
最大长度为255个字符,DBMS可以选择使用单个字节来指示字段中数据的长度。如果限制为256或更大,则需要两个字节。
长度为零的值肯定对varchar
数据有效(除非另有约束)。大多数系统将此类空字符串视为与NULL不同,但某些系统(尤其是Oracle)将空字符串视为与NULL完全相同。对于空字符串不为NULL的系统,需要行中某处的附加位来指示该值是否应被视为NULL。
如您所知,这是历史优化,可能与当今大多数系统无关。
答案 1 :(得分:31)
答案 2 :(得分:17)
255是可以存储在单字节无符号整数中的最大数值(假设为8位字节) - 因此,出于某种目的存储字符串长度的应用程序将优先于255而不是256,因为这意味着它们只需要为“size”变量分配1个字节。
答案 3 :(得分:14)
来自MySQL手册:
数据类型:
VARCHAR(M),VARBINARY(M)需要存储:
如果列值需要0 - 255个字节,则为L + 1个字节;如果值可能需要超过255个字节,则为L + 2个字节
理解并做出选择。
答案 4 :(得分:13)
255是8位整数的最大值:11111111 = 255。
答案 5 :(得分:7)
最大长度为255允许数据库引擎仅使用1个字节来存储每个字段的长度。你是对的,1个字节的空间允许你为字符串的长度存储2 ^ 8 = 256个不同的值。
但是如果你允许字段存储零长度的文本字符串,你需要能够在长度上存储零。因此,您可以允许256个不同的长度值,从零开始:0-255。
答案 6 :(得分:6)
varchars通常被实现为pascal字符串:保持字节#0中的实际长度。因此,长度绑定为255.(字节的值从0到255之间变化。)
答案 7 :(得分:5)
&LT;&LT;
重新收集位/字节存储的基础知识,它需要一个字节来存储256以下的整数,并且需要两个字节来存储256到65536之间的任何整数。 因此,它需要相同的空间(两个字节)来存储511或512或者就此而言65535 .... 因此很明显,上面讨论中提到的这个论点是varchar(512)或varchar(511)的N / A.
答案 8 :(得分:4)
8位无符号= 256字节
255个字符+字节0表示长度
答案 9 :(得分:3)
过去所有字符串都需要NUL终止符,或者#34;反斜杠为零&#34;。更新的数据库没有。这是&#34; 255个字符的文字&#34;用&#34; \ 0&#34;最后自动添加,以便系统知道字符串结束的位置。如果你说VARCHAR(256),那么它最终会是257,然后你就会在一个字符的下一个寄存器中。浪费的。这就是为什么一切都是VARCHAR(255)和VARCHAR(31)的原因。出于习惯,255似乎已经陷入困境,但31岁的人变成了32岁,而511岁的人变成了512岁。那部分很奇怪。我自己写VARCHAR(256)很难。
答案 10 :(得分:0)
我认为这可能会回答你的问题。看起来它是早期系统中varchar的最大限制。我把它从另一个stackoverflow问题中删除了。
很难知道最长的邮政地址是什么,当然,这就是为什么很多人选择长的VARCHAR,肯定比任何地址都要长。 255是习惯因素,因为它可能是一些数据库中VARCHAR的最大长度(在最近的时候直到PostgreSQL)。
Are there disadvantages to using a generic varchar(255) for all text-based fields?
答案 11 :(得分:0)
数据以二进制形式保存在内存中,0和1是二进制数字。可容纳1字节(8位)的最大二进制数是11111111,可转换为十进制255.