Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节
Posted
技术标签:
【中文标题】Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节【英文标题】:Mysql::Error: Specified key was too long; max key length is 1000 bytes 【发布时间】:2011-03-30 04:15:17 【问题描述】:script/generate acts_as_taggable_on_migration
rake db:migrate
原因
mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`)
我该怎么办?
这是我的数据库编码:
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+
7 rows in set (0.00 sec)
【问题讨论】:
先提供更多信息。正在迁移什么? github.com/mbleigh/acts-as-taggable-on github.com/mbleigh/acts-as-taggable-on/blob/master/generators/… community.engineyard.com/discussions/problems/… 的类似问题已解决,但不知道如何解决。 修复 767 问题:mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes 【参考方案1】:这只是一个 MySQL 问题 -
MySQL 有不同的引擎 - MyISAM、InnoDB、Memory...
MySQL has different limits on the amount of space you can use to define indexes on column(s) - for MyISAM it's 1,000 bytes; it's 767 for InnoDB。这些列的数据类型很重要 - 对于 VARCHAR
,它是 3 倍,因此 VARCHAR(100)
上的索引将占用 300 个字节(因为 100 个字符 * 3 = 300)。
为了在达到上限时提供一些索引,您可以针对列数据类型的部分定义索引:
CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))
假设your_column
是VARCHAR(100)
,上例中的索引将仅位于前50 个字符上。搜索超过第 50 个字符的数据将无法使用索引。
【讨论】:
你知道一种不会导致上述错误的MySQL引擎吗? 通过将默认引擎从 MyISAM 更改为 InnoDB 解决。谢谢。 “通过将默认引擎从 MyISAM 更改为 InnoDB 解决。”听起来不可能,因为 InnoDB 实际上只有更短的限制。 听起来不可能,但从 MyISAM 更改为 InnoDB 也对我有用。 WAMP、Win10【参考方案2】:这似乎是此处报告的错误:http://bugs.mysql.com/bug.php?id=4541
如果您已经尝试了这篇文章中的所有答案,但仍然出现错误,您可能需要尝试在 SQL 查询窗口中运行此命令。
set GLOBAL storage_engine='InnoDb';
【讨论】:
未知系统变量“storage_engine”。从 mysql 5.7 起不起作用【参考方案3】:如果这个错误发生在迁移等过程中,可以通过修改MySql的配置文件(*.ini)来解决
default-storage-engine=InnoDB
【讨论】:
【参考方案4】:我认为您的一个字段是包含 1000 多个字符的 varchar。例如语境?
想想索引的含义。当所有索引字段都在 where 子句中时,它可以快速访问一行。如果索引太长(如果 mysql 超过 1000 字节),那么使用索引是没有意义的,因为它可能比使用全表扫描访问完整的表要慢。
我建议缩短索引,例如标记为 taggable_id 和 taggable_type,如果它们都较短的话。
干杯 - 格哈德
【讨论】:
您好,这是一个常见的 Rails 插件/gem,我没有看到 Internet 上引用此错误消息 - 不确定是迁移文件还是我的数据库需要修改... ? 您使用的是哪个 MySql 版本?当前的还是Mysql 4.x?以上是关于Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节的主要内容,如果未能解决你的问题,请参考以下文章
SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节
UNIQUE INDEX - 指定的键太长;最大密钥长度为 767 字节 [重复]
SQLSTATE[42000]:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节
Laravel 迁移错误:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节 laravel 5.3