196

在多个课程、书籍和工作中,我看到定义为 VARCHAR(255) 的文本字段是“短”文本的默认值。除了作为一个不错的整数之外,是否有任何充分的理由经常选择 255 的长度?它是否是过去某个时候有充分理由的坚持(无论它是否适用于今天)?

当然,我意识到,如果您以某种方式知道字符串的最大长度,则更严格的限制会更理想。但是,如果您使用的 VARCHAR(255) 可能表明您不知道最大长度,那么它只是一个“短”字符串。


注意:我发现了这个问题(varchar(255) v tinyblob v tinytext),它说 VARCHAR( n ) 对于n <=255需要n +1 字节的存储空间,对于n >255 需要n +2 字节的存储空间。这是唯一的原因吗?这似乎有点武断,因为与 VARCHAR(256) 相比,您只会节省两个字节,并且您可以通过将其声明为 VARCHAR(253) 来轻松保存另外两个字节。

4

10 回答 10

197

使用 255 是因为它是 8 位数字可以计算的最大字符数。它最大限度地利用了 8 位计数,而无需轻率地需要另一个完整字节来计算 255 以上的字符。

以这种方式使用时,VarChar 仅使用字节数 + 1 来存储您的文本,因此您最好将其设置为 255,除非您希望对字段中的字符数进行硬限制(如 50)。

于 2009-08-01T20:56:29.780 回答
127

从历史上看,255 个字符通常是某些 DBMS 中 a 的最大长度,VARCHAR如果您想使用 UTF-8 并对列进行索引(由于索引长度限制),有时它仍然是有效的最大值。

于 2009-08-01T20:57:31.850 回答
24

可能是因为 SQL Server 和 Sybase(仅举两个我熟悉的名称)过去,一VARCHAR列中的字符数最多为 255 个字符。对于 SQL Server,这在 1996/1997 年左右的版本 7 中发生了变化……但旧习惯有时很难改掉。

于 2009-08-01T21:17:17.880 回答
22

我将回答字面上的问题: ,你看到 VARCHAR(255) 经常使用没有一个很好的理由(确实有原因,正如其他答案中所讨论的那样,只是不是很好)。由于架构师选择了 VARCHAR(300) 而不是 VARCHAR(255),因此您不会找到许多灾难性失败的项目示例。即使您谈论的是 CHAR 而不是 VARCHAR,这也将是一个几乎完全无关紧要的问题。

于 2009-08-01T21:24:37.537 回答
16

当你说2^8你得到256,但计算机术语中的数字是从数字开始的0。所以,然后你得到了255,你可以在 IP 的互联网掩码或 IP 本身中探测它。

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

这有帮助吗?

于 2012-01-17T14:02:04.317 回答
9

注意:我发现了这个问题(varchar(255) v tinyblob v tinytext),它说 VARCHAR( n ) 对于n <=255需要n +1 字节的存储空间,对于n >255 需要n +2 字节的存储空间。这是唯一的原因吗?这似乎有点武断,因为与 VARCHAR(256) 相比,您只会节省两个字节,并且您可以通过将其声明为 VARCHAR(253) 来轻松保存另外两个字节。

不,您不会通过声明 253 来节省两个字节。 varchar 的实现很可能是一个长度计数器和一个可变长度的非终止数组。这意味着如果您将“hello”存储在 varchar(255) 中,您将占用 6 个字节:一个字节用于长度(数字 5)和 5 个字节用于五个字母。

于 2009-08-01T21:26:17.097 回答
4

一个无符号的 1 字节数字可以包含 [0-255] 范围(含)。所以当你看到 255 时,主要是因为程序员在基础上思考10(明白这个笑话吗?):)

实际上,有一段时间,255 是您可以在 MySQL 中提供 VARCHAR 的最大大小,并且在索引和其他问题上使用 VARCHAR 优于 TEXT 有优势。

于 2009-08-01T20:59:34.140 回答
4

在许多应用程序中,例如 MsOffice(直到版本 2000 或 2002),每个单元格的最大字符数为 255。将数据从能够处理每个字段超过 255 个字符的程序移入/移出这些应用程序是一场噩梦。目前,限制越来越少。

于 2010-11-26T15:19:32.857 回答
3

0000 0000 -> 这是一个 8 位二进制数。一个数字代表一个位。

你这样算:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

每个位可以是两个值之一:开或关。总的最高数可以用乘法表示:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

或者

2^8 - 1. 

我们减去一个,因为第一个数字是 0。

255 可以容纳相当多的值(不是双关语)。

随着我们使用更多位,最大值呈指数增长。因此,出于许多目的,添加更多位是多余的。

于 2019-12-19T01:23:52.440 回答
1

另一个原因可能是在 Windows 上非常古老的数据访问库中,例如 RDO 和 ADO(COM 版本不是 ADO.NET),您必须调用特殊方法 GetChunk,才能从超过 255 个字符的列中获取数据。如果您将 varchar 列限制为 255,则不需要此额外代码。

于 2019-04-02T14:16:21.993 回答