Mysql:: Ошибка: указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт: CREATE INDEX
Я работаю с рельсами 2.3.5 приложения, у меня есть это поле
t.string "trip_cities", :limit => 256
И этот индекс
add_index "bookings", ["trip_cities"], :name => "trip_cities"
Когда я пытаюсь выполнить:
bundle exec rake db:test:load
Я получаю эту ошибку Mysql::Error: Specified key was too long; max key length is 767 bytes: CREATE INDEX 'trip_cities' ON 'bookings' ('trip_cities')
и не знаю, как это решить.
Ответы
Ответ 1
Похоже, что в настройке по умолчанию используется набор символов UTF8.
MySQL ограничивает длину ключей байтами, а не символами. Поскольку реализация UTF8 MySQL использует 3 байта на символ, максимальная длина ключа в столбце UTF8 в 3 раза больше длины ключа в символах (длина ключа - это полная длина поля, если явно не указано).
В этом случае максимальная длина ключа будет 256 * 3
, которая равна 768
. Вам нужно либо ограничить длину ключа, либо изменить сортировку столбца.
Ответ 2
как насчет изменения самой миграции:
remove_index "bookings", :name => :trip_cities
add_index "bookings", ["trip_cities"], :name => :trip_cities, :length => { :trip_cities => 255 }
Ответ 3
Вы должны воссоздать вашу базу данных с правильными параметрами.
Это помогло мне с той же проблемой
CREATE DATABASE ${DB} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Ответ 4
Установите ограничение длины строки в 191 символ, например:
t.string :project, index: { unique: true }, limit: 191
ИЛИ ЖЕ
Используйте этот патч: https://github.com/rails/rails/issues/9855#issuecomment-390366184
Ответ 5
Добавление параметра length
к индексу в schema.rb
сработало для меня:
t.index ["your_index", "fields"], name: "index_your_index_fields", unique: true, length: 191
Я заметил, когда миграция Rails делала это автоматически, думала, что это не относится к репо. Мне пришлось запустить rails schema:load
на другую машину, и она не работала, хотя добавление вышеизложенного решило эту проблему.
Надеюсь, что это помогает кому-то.