Mysql::错误:指定的密钥太长;最大密钥长度为1000字节

Mysql::错误:指定的密钥太长;最大密钥长度为1000字节,mysql,sql,ruby-on-rails,indexing,mysql-error-1071,Mysql,Sql,Ruby On Rails,Indexing,Mysql Error 1071,原因 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` (`ta

原因

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`)

我认为你的一个字段是一个超过1000个字符的varchar。e、 g.背景

思考一下索引的含义。当所有索引字段都在where子句中时,它可以快速访问行。如果索引太长(在mysql超过1000字节的情况下),那么使用索引是没有意义的,因为它可能比使用完整表扫描访问完整表慢

我建议缩短索引,例如,缩短为taggable_id和taggable_type,如果两者都是较短的一次

干杯
-Gerhard这完全是MySQL的问题-

MySQL有不同的引擎——MyISAM、InnoDB、内存

。这些列的数据类型很重要-对于
VARCHAR
,它是3倍,因此
VARCHAR(100)
上的索引将占用其中的300个字节(因为100个字符*3=300)

为了在达到上限值时适应某些索引,可以针对列数据类型的部分定义索引:

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)

假设
您的_列
VARCHAR(100)
,则上例中的索引将仅位于前50个字符上。搜索超过第50个字符的数据将无法使用索引。

这似乎是此处报告的错误:

如果您已经尝试了本文中的所有答案,但仍然得到错误,那么您可能希望尝试在SQL查询窗口中运行此命令

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

如果在迁移等过程中出现此错误,可以通过更改MySql(*.ini)的配置文件来解决


首先提供更多信息。正在迁移什么?类似的问题在这里得到了解决,但不知道如何解决。767问题的修复:嗨,这是一个common Rails插件/gem,我没有看到这个错误消息在互联网上被引用-不确定是迁移文件还是我的数据库需要修改…?您使用的是哪个MySql版本?当前的Mysql或Mysql 4.x?您知道有一种Mysql引擎不会导致上述错误吗?通过将默认引擎从MyISAM更改为InnoDB来解决。谢谢。“通过将默认引擎从MyISAM更改为InnoDB来解决。”听起来不可能,因为InnoDB实际上只有一个较短的限制。听起来不可能,但从MyISAM更改为InnoDB也对我有效。WAMP,Win10未知系统变量“存储引擎”。不适用于mysql 5.7
set GLOBAL storage_engine='InnoDb';
default-storage-engine=InnoDB