有没有一个很好的理由我经常使用VARCHAR(255)(而不是另一个长度)?

时间:2009-08-01 20:51:10

标签: database database-design types varchar

在多个课程,书籍和工作中,我看到将文本字段定义为VARCHAR(255)作为“短”文本的默认类型。除了a nice round number之外,有没有什么好的理由经常选择长度为255?在过去的某个时候,当有充分的理由(无论今天是否适用)时,这是一种坚持吗?

当然,我知道如果你知道字符串的最大长度,更严格的限制会更理想。但是如果你使用VARCHAR(255)可能表示你不知道最大长度,那只是它是一个“短”字符串。


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

10 个答案:

答案 0 :(得分:140)

使用

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

当以这种方式使用时,VarChar仅使用字节数+ 1来存储您的文本,因此您也可以将其设置为255,除非您想要字段中字符数的硬限制(如50)

答案 1 :(得分:83)

从历史上看,255个字符通常是某些DBMS中VARCHAR的最大长度,如果您想使用UTF-8并将列编入索引,它有时仍会成为有效最大值(因为指数长度限制)。

答案 2 :(得分:19)

可能是因为SQL Server和Sybase(我熟悉的两个名字)曾经在VARCHAR列中的字符数最多包含255个字符。对于SQL Server,这在1996/1997左右的版本7中发生了变化......但旧习惯有时会很难。

答案 3 :(得分:14)

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

答案 4 :(得分:11)

当您说2^8时,您获得256,但计算机中的数字从数字0开始。那么,你得到了255,你可以在互联网掩码中探测IP或IP本身。

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

这有帮助吗?

答案 5 :(得分:7)

  

注意:我发现了这个问题   (varchar(255)v tinyblob v tinytext),   这表示VARCHAR(n)需要   对于n <= 255,n + 2,存储n + 1个字节   n> 255的存储字节。这是   唯一的理由?这似乎有点儿   任意的,因为你只会   与...相比节省两个字节   VARCHAR(256),你也可以   轻松保存另外两个字节   宣布它为VARCHAR(253)。

没有。你不要通过声明253来保存两个字节。 varchar的实现很可能是长度计数器和可变长度的非终止数组。这意味着如果在varchar(255)中存储“hello”,则占用6个字节:长度为1个字节(数字为5),5个字母为5个字节。

答案 6 :(得分:3)

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

实际上,有一段时间,255是你在MySQL中提供VARCHAR的最大尺寸,使用VARCHAR优于TEXT以及索引和其他问题是有好处的。

答案 7 :(得分:3)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

您这样数:

0000 0000 →(0)

0000 0001 →(1)

0000 0010 →(2)

0000 0011 →(3)

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

StateT s m a

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

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

255可以容纳很多(没有双关语)值。

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