当前位置: 首页 > 面试题库 >

#1071-指定的密钥太长;最大密钥长度为767字节

尤夕
2023-03-14
问题内容

当我执行以下命令时:

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

我收到此错误消息

#1071 - Specified key was too long; max key length is 767 bytes

有关column1和column2的信息:

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

我认为varchar(20)只需要21个字节,而varchar(500)只需要501个字节。因此,总字节数是522,少于767。那么为什么收到错误消息?

#1071 - Specified key was too long; max key length is 767 bytes

问题答案:

在MySQL版本5.6(及更早版本)中,InnoDB表的前缀限制为767个字节。MyISAM表的长度为1,000字节。在MySQL 5.7及更高版本中,此限制已增加到3072字节

您还必须注意,如果在utf8mb4编码的大char或varchar字段上设置索引,则必须将767字节(或3072字节)的最大索引前缀长度除以4,得到191。这是因为utf8mb4字符的最大长度为四个字节。对于utf8字符,它将是三个字节,导致最大索引前缀长度为254。

您必须采取的一种选择是将下限放在VARCHAR字段上。

另一个选择(根据对此问题的响应)是获取列的子集而不是整个列,即:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

进行调整,您需要获取要应用的密钥,但是我想知道是否值得对有关该实体的数据模型进行检查,以查看是否存在可以使您实现预期业务规则而又不违反MySQL限制的改进。



 类似资料:
  • 问题内容: 我知道有关此标题的问题已经回答过,但是请继续阅读。发布前,我已彻底阅读了关于此错误的所有其他问题/答案。 我收到以下查询的上述错误: 有谁知道为什么以及如何解决它?问题是-相同的查询在我的本地计算机上运行完美,在我以前的主机上也运行良好。顺便说一句,它来自一个成熟的项目- phpdevshell-所以我猜这些家伙知道他们在做什么,尽管你永远都不知道。 任何线索表示赞赏。 我正在使用ph

  • 问题内容: 我正在使用Rails 2.3.5应用程序,在女巫中我有这个领域 而这个指数 当我尝试执行时: 我收到此错误,并且不太了解如何解决。 问题答案: 听起来好像默认排序规则使用UTF8字符集。 MySQL通过字节而不是字符来限制键的长度。由于MySQL使用的UTF8实现每个字符允许3个字节,因此UTF8列上键的最大长度是键长度(以字符为单位)的3倍(如果未明确指定,则键长度为字段的全长)。

  • 问题内容: 我无法在上创建索引。 MySQL: 问题答案:

  • 在cmd中提交“php artisan migrate:fresh”后出现错误。 SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter tableaddunique()

  • 问题内容: 原因 我该怎么办? 这是我的数据库编码: 问题答案: 这仅仅是一个MySQL问题- MySQL具有不同的引擎-MyISAM,InnoDB,内存… MySQL对可用于在列上定义索引的空间量有不同的限制- MyISAM为1,000字节;对于InnoDB是767 。这些列的数据类型很重要- 例如,它是3倍,因此a上的索引将占用其中300个字节(因为100个字符* 3 = 300)。 为了在达

  • 问题内容: Laravel 5.4上的迁移错误 [Illuminate \ Database \ QueryException] SQLSTATE [42000]:语法错误或访问冲突:1071指定的密钥太长;默认值为0。最大密钥长度为767字节(SQL:更改表添加唯一()) [PDOException] SQLSTATE [42000]:语法错误或访问冲突:1071指定的密钥太长;默认值为0。最大