为什么我不能将varchar设置为1000的长度?

6
如果这很重要,我也把它设置为唯一的。
我设定varchar的最大值为745(也设置为唯一)。

2
745的限制是因为InnoDB数据库类型的限制(应该还有一点,但我认为这是相关的):索引键前缀最多可以达到767个字节。请参见第12.1.8节“CREATE INDEX Syntax”。 http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html 还请参阅我的答案。 - Felix Kling
5个回答

7
根据你所使用的 MySQL 版本不同,VARCHAR 类型有长度限制。在 MySQL 5.0.3 之前,varchar 长度限制为 255 个字符。在 MySQL 5.0.3 及之后版本中,长度限制为 0 到 65,535 个字符。详见:http://dev.mysql.com/doc/refman/5.0/en/char.html

2

更新:

也许与最大键长为1000字节有关:

最大键长度为1000字节。这也可以通过更改源代码并重新编译来更改。对于键长大于250字节的情况,使用比默认值1024字节更大的密钥块大小。

由于在键上创建了索引并且它可以在没有索引的情况下工作,因此这是有意义的。
尽管如此,您可以在大于1000字节的varchar列上建立索引,正如您可以在下面的答案中阅读到的那样。

或者,如果您正在使用InnoDB,则存在一些限制

索引键前缀最多可达767字节。请参见第12.1.8节“CREATE INDEX Syntax”。


我认为这是为了确保索引不会过大并能够快速运行。

如果一个字符串列很可能具有唯一的前缀字符,则最好仅对该前缀进行索引,并利用MySQL支持在列的左侧部分创建索引的功能(请参见第12.1.8节“CREATE INDEX Syntax”)。较短的索引更快,不仅因为它们需要更少的磁盘空间,而且还因为它们在索引缓存中提供了更多的命中,从而减少了磁盘寻道。请参见第7.5.3节“调整服务器参数”。

这也意味着您可以定义应该建立索引的此类列的前n个字符。也许这有助于避免问题。

例子:

CREATE INDEX part_of_name ON customer (name(10));

1

旧版的mysql?

5及以上版本可以使用长varchar

http://dev.mysql.com/doc/refman/5.0/en/char.html

VARCHAR列中的值是可变长度字符串。在MySQL 5.0.3之前,长度可以指定为0到255的值,在5.0.3及以后的版本中可以指定为0到65,535。在MySQL 5.0.3及以后的版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,这是所有列共享的)和所使用的字符集。

1
新的。如果未设置为唯一,则可以将varchar设置为1000。 - AleGore

1

浏览MySQL手册可能会很有用: http://dev.mysql.com/doc/refman/5.0/en/char.html

VARCHAR列中的值是可变长度字符串。在MySQL 5.0.3之前,长度可以指定为0到255的值,在5.0.3及以后的版本中为0到65,535。在MySQL 5.0.3及以后的版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,共享所有列)和所使用的字符集。

另外: 关键值长度不能超过500个字符。(报告见http://bugs.mysql.com/bug.php?id=2130


1
太多了。4个答案都引用自同一页,哈哈。 - Joel A. Villarreal Bertoldi
这里列出了另一个限制。而这个限制就是答案。 - osgx

0

下一步可能会更长的是文本,但据我所知,它在数据库中有一些非常巨大的长度限制(如果有的话),因此您需要在编程SQL/后端应用程序逻辑中提供限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接