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;

Ответ 5

Добавление параметра length к индексу в schema.rb сработало для меня:

t.index ["your_index", "fields"], name: "index_your_index_fields", unique: true, length: 191

Я заметил, когда миграция Rails делала это автоматически, думала, что это не относится к репо. Мне пришлось запустить rails schema:load на другую машину, и она не работала, хотя добавление вышеизложенного решило эту проблему.

Надеюсь, что это помогает кому-то.