在多个课程,书籍和工作中,我看到将文本字段定义为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)来轻松地保存另外两个字节。
答案 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可以容纳很多(没有双关语)值。
随着我们使用更多位,最大值将呈指数增长。因此,出于许多目的,增加更多的位是过大的。