起きた事象
AWSのElastic Beanstalkで構築したRDS(PostgreSQL)で、日本語のソートがおかしいことに気づいた。
レコードにはひらがなが入っているのに、アルファベットに変換してソートされたような挙動になっていた。
調査
どうやらよくあることらしく、COLLATEの設定によるものらしい。
ebdb=> SHOW LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 行)
対応
DBは本番環境ですでに動いており、このカラムのみをソートにつかっているため、カラムのcollate設定をmigrationで変更することにした。
db/migrate/20150724062401_change_kana_collate_to_users.rb
class ChangeKanaCollateToUsers < ActiveRecord::Migration
def change
execute 'alter table users alter COLUMN kana type varchar(255) collate "ja_JP.utf8";'
end
end
あとはいつもの通り、migrateするだけ。(git aws.push
で自動適用される)
テスト
開発環境では、デフォルトがja_JP.utf8
になっていたので、ソートに問題は起きていなかった。
上記のmigrationスクリプトが正常に動作することを確認するため、事前に手動で上記のカラムのcollate設定を変更した。
> alter table users alter COLUMN kana type varchar(255) collate "en_US.UTF8";
この上で、migrateコマンドが正常に動作することを確認した。
$ rake db:migrate