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)
Это исключительно проблема MySQL -
MySQL имеет различные движки - MyISAM, InnoDB, Memory...
MySQL имеет разные ограничения на количество места, которое вы можете использовать для определения индексов на столбцах (колонках) - для MyISAM это 1000 байт; для InnoDB - 767. Тип данных этих столбцов имеет значение - для VARCHAR
он равен 3x, поэтому индекс на VARCHAR(100)
займет 300 из этих байт (потому что 100 символов * 3 = 300).
Чтобы приспособить индексацию при достижении потолочного значения, можно определить индекс относительно частей типа данных столбца:
CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))
Предположим, что ваш_столбец
- это VARCHAR(100)
, индекс в приведенном выше примере будет только на первых 50 символах. При поиске данных после 50-го символа индекс не будет использоваться.
Я думаю, что одно из ваших полей - это varchar с более чем 1000 символов. например контекст?
Подумайте о значении индекса. Это быстрый доступ к строке, когда все ваши проиндексированные поля находятся внутри предложения where. Если индекс слишком длинный (в случае mysql более 1000 байт), нет смысла использовать индекс, потому что он, вероятно, медленнее, чем доступ к полной таблице с полным сканированием таблицы.
Я бы посоветовал сократить индекс, например, до taggable_id и taggable_type, если они оба короче один раз.
Ура - Герхард