#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
Все таблицы и поля, созданные с помощью миграции Rails, имеют latin1_swedish_ci
collate. Поскольку в моем проекте используется русский язык, эта сортировка неверна.
Возможно ли использовать миграции с utf8_general_ci
?
P.S. Моя база данных.yml:
development:
adapter: mysql2
encoding: utf8
collation: utf8_general_ci
reconnect: false
database: my_development
pool: 5
username: username
password: 'heavy'
host: localhost
Ответ №1:
Вот пример указания параметров сортировки в вашей миграции:
create_table :users, :options => 'COLLATE=utf8_general_ci' do |t|
t.string :email
t.timestamps
end
Комментарии:
1. Это помогает, но в schema.rb я вижу: «КОДИРОВКА ПО умолчанию ENGINE = InnoDB = utf8», кодировка теперь правильная, но сортировки нет.
Ответ №2:
Rails не устанавливает параметры сортировки для соединения (только для базы данных в create_database
вызове). Лучшая идея здесь — установить его самостоятельно в файле конфигурации MySQL вашей системы, например. /etc/my.cnf
На самом деле я рекомендую вам сообщить MySQL, чтобы он вообще игнорировал клиентское рукопожатие, лучше, чтобы сервер сообщал клиенту, какой набор символов и параметры сортировки использовать. Соответствующие части моего MySQL conf выглядят следующим образом:
[server]
character_set_server=utf8
collation_server=utf8_unicode_ci
skip_character_set_client_handshake
Если вы пойдете по этому пути, просто не забудьте сделать то же самое на сервере, на котором вы выполняете развертывание. Если вы не знаете, где находится ваш конфигурационный файл для MySQL, запустите это из командной строки: my_print_defaults | grep -A1 "Default options"
Это даст вам конфигурационные файлы, которые MySQL будет искать (по порядку).
Комментарии:
1. «Не работает» не дает нам никаких оснований для продолжения. Вы добавляете это в свой,
my.cnf
перезапускаетеmysqld
, чтобы он получил новую конфу, затем выполняетеcreate_table
миграцию, и вы говорите мне, что он не был создан с помощью этой сортировки? Если это так, возможно, вам также нужно удалить и воссоздать базу данных (я не думал, что вам нужно будет это делать).2. Нет разницы между выполнением миграций до вставки этих строк и после. Таблицы находятся в
latin1_swedish_ci
стороне от всех…3. Для этого потребуется доступ на уровне администратора к серверу базы данных, а это возможно не каждый раз. Я думаю, что другой ответ был бы лучше с точки зрения разработчика.