【问题标题】:Mysql::Error: Specified key was too long; max key length is 1000 bytesMysql::Error: 指定的键太长;最大密钥长度为 1000 字节
【发布时间】: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)

【问题讨论】:

标签: mysql sql ruby-on-rails indexing mysql-error-1071


【解决方案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_columnVARCHAR(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?
    猜你喜欢
    • 2011-06-25
    • 2010-11-05
    • 2011-09-03
    • 2012-02-03
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多