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

时间:2010-08-15 20:15:17

标签: 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` (`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 个答案:

答案 0 :(得分:50)

这只是一个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,它是3x,因此VARCHAR(100)上的索引将占用300个字节(因为100个字符* 3 = 300)。

要在达到上限值时容纳一些索引,可以根据列数据类型的部分定义索引:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

假设your_column是VARCHAR(100),上例中的索引将只在前50个字符上。搜索超过第50个字符的数据将无法使用索引。

答案 1 :(得分:3)

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

如果您已尝试此帖子上的所有答案并仍然收到错误,则可能需要尝试在SQL查询窗口中运行此命令。

set GLOBAL storage_engine='InnoDb';

答案 2 :(得分:2)

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

default-storage-engine=InnoDB

答案 3 :(得分:0)

我认为你的一个字段是一个包含超过1000个字符的varchar。例如背景?

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

我建议缩短索引,例如taggable_id和taggable_type,如果这些都是较短的一次。

干杯 - 格哈德