Подтвердить что ты не робот

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

Ответ 1

Это исключительно проблема 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-го символа не сможет использовать индекс.

Ответ 2

Кажется, это ошибка, о которой сообщалось здесь: http://bugs.mysql.com/bug.php?id=4541

Если вы попробовали все ответы на это сообщение и все еще получаете ошибку, вы можете попробовать запустить эту команду в окне запроса SQL.

set GLOBAL storage_engine='InnoDb';

Ответ 3

если эта ошибка возникает в некоторых процессах, таких как перенос, ее можно решить, изменив конфигурационный файл MySql (*.ini)

default-storage-engine=InnoDB

Ответ 4

Я думаю, что одно из ваших полей - varchar с более чем 1000 символами. например контекст?

Подумайте о значении индекса. Это быстрый доступ к строке, когда все ваши проиндексированные поля находятся внутри предложения where. Если индекс длинный (в случае mysql более 1000 байтов), нет смысла использовать индекс, потому что он, вероятно, медленнее, чем доступ к полной таблице с полным сканированием таблицы.

Я бы предложил сократить индекс, например, taggable_id и taggable_type, если они оба короче один раз.

Приветствия - Герхард

Ответ 5

У меня была эта проблема, поэтому мое решение было следующим:

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 символов. Возможно, ваши данные имеют некоторый верхний предел.