214

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

varchar(255)

考虑到这是容量或量级,而不是索引器为什么 255 比 256 更受欢迎?是否为某种目的保留了一个字节(终止符或空值之类的)?

大概 varchar(0) 是胡说八道(容量为零)?在哪种情况下 2^8 的空间肯定应该是 256?

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

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

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

编辑:

感谢您的回答,似乎有一些共识是使用一个字节来存储大小,但这并没有在我心中明确解决这个问题。

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

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

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

4

12 回答 12

181

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

长度为零的值肯定对varchar数据有效(除非另有约束)。大多数系统将此类空字符串视为与 NULL 不同,但某些系统(尤其是 Oracle)将空字符串视为与 NULL 相同。对于空字符串不为 NULL 的系统,需要在行中的某处添加一个位来指示该值是否应被视为 NULL。

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

于 2010-02-26T09:44:33.667 回答
37

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

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

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

于 2010-02-26T09:47:09.790 回答
20

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

于 2010-02-26T09:43:31.060 回答
18

来自 MySQL 手册:

数据类型:
VARCHAR(M)、VARBINARY(M)

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

了解并做出选择。

于 2012-07-05T04:06:58.803 回答
14

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

于 2010-02-26T09:43:59.797 回答
8

<<

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

于 2014-07-03T09:09:42.270 回答
7

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

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

于 2010-02-26T10:11:42.220 回答
6

varchars 通常被实现为帕斯卡字符串:在字节#0 中保存实际长度。因此长度被绑定到 255。(一个字节的值从 0 到 255 不等。)

于 2010-02-26T09:45:36.803 回答
6

过去,所有字符串都需要一个 NUL 终止符,或“反斜杠零”。更新的数据库没有。它是“255 个文本字符”,末尾自动添加了“\0”,因此系统知道字符串的结束位置。如果你说 VARCHAR(256),它最终会是 257,然后你会在下一个寄存器中找到一个字符。浪费。这就是为什么一切都是 VARCHAR(255) 和 VARCHAR(31)。出于习惯,255 似乎一直存在,但 31 变成了 32,而 511 变成了 512。那部分很奇怪。很难让自己写 VARCHAR(256)。

于 2015-07-16T19:37:01.020 回答
5

8 位无符号 = 256 字节

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

于 2010-02-26T09:53:06.593 回答
0

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

当然,很难知道最长的邮政地址是多少,这就是为什么许多人选择肯定比任何地址都长的长 VARCHAR 的原因。并且 255 是习惯性的,因为它可能是早期某些数据库中 VARCHAR 的最大长度(以及直到最近的 PostgreSQL)。

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

于 2013-03-11T16:19:00.590 回答
-1

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

于 2013-09-26T19:49:22.527 回答