Mysql:: Ошибка: указанный ключ был слишком длинным; максимальная длина ключа 1000 байтов
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 ответа
Это исключительно проблема MySQL -
У MySQL разные движки - MyISAM, InnoDB, Memory...
MySQL имеет различные ограничения на объем пространства, которое вы можете использовать для определения индексов для столбца (столбцов) - для MyISAM это 1000 байтов; это 767 для 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 (*.ini)
default-storage-engine=InnoDB
Это, похоже, ошибка, о которой сообщалось здесь: http://bugs.mysql.com/bug.php?id=4541
Если вы перепробовали все ответы в этом посте и все еще получаете сообщение об ошибке, вы можете попытаться выполнить эту команду в своем окне SQL-запроса.
set GLOBAL storage_engine='InnoDb';
Я думаю, что одним из ваших полей является varchar с более чем 1000 символов. например, контекст?
Подумайте о значении индекса. Это быстрый доступ к строке, когда все ваши проиндексированные поля находятся в предложении where. Если индекс слишком длинный (в случае mysql более 1000 байтов), нет смысла использовать индекс, потому что он, вероятно, медленнее, чем доступ к полной таблице с полным просмотром таблицы.
Я бы предложил сократить индекс, например, до taggable_id и taggable_type, если оба они короче один раз.
Приветствия - Герхард
У меня была эта проблема, поэтому мое решение было таким:
alter table robs_temp.missing_email change email email varchar(300);
ALTER TABLE robs_temp.missing_email add primary key (email); -- Now it works.
Согласно википедии действительные электронные письма не могут быть длиннее 256 символов. Возможно, ваши данные имеют какой-то верхний предел.