Mysql :: Ошибка: указанный ключ был слишком длинным;максимальная длина ключа 1000 байтов - PullRequest
24 голосов
/ 16 августа 2010
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 ]

50 голосов
/ 16 августа 2010

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

3 голосов
/ 17 июля 2015

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

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

set GLOBAL storage_engine='InnoDb';
2 голосов
/ 12 октября 2015

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

default-storage-engine=InnoDB
0 голосов
/ 16 августа 2010

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

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

Ура - Герхард

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...