27
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)
4

4 回答 4

55

这只是一个 MySQL 问题 -

MySQL 有不同的引擎——MyISAM、InnoDB、Memory...

MySQL 对可用于在列上定义索引的空间量有不同的限制 - 对于 MyISAM,它是 1,000 字节;InnoDB 是 767。这些列的数据类型很重要——因为VARCHAR它是 3x,所以 a 上的索引VARCHAR(100)将占用 300 个字节(因为 100 个字符 * 3 = 300)。

为了在达到上限时容纳一些索引,您可以针对列数据类型的部分定义索引:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

假设 ,上面示例your_columnVARCHAR(100)的索引将仅位于前 50 个字符上。搜索超过第 50 个字符的数据将无法使用索引。

于 2010-08-15T21:24:06.527 回答
3

这似乎是这里报告的错误:http ://bugs.mysql.com/bug.php?id=4541

如果您已经尝试了这篇文章中的所有答案,但仍然出现错误,您可能需要尝试在 SQL 查询窗口中运行此命令。

set GLOBAL storage_engine='InnoDb';
于 2015-07-17T18:25:16.513 回答
2

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

default-storage-engine=InnoDB
于 2015-10-12T10:12:40.650 回答
0

我认为你的一个领域是一个超过 1000 个字符的 varchar。例如上下文?

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

我建议缩短索引,例如标记为 taggable_id 和 taggable_type,如果它们都较短的话。

干杯 - 格哈德

于 2010-08-15T20:29:25.040 回答