Rails
PostgreSQL
RDS
ElasticBeanstalk

すでに構築済みのRDS(PostgreSQL)で日本語ソートがおかしい場合のmigration

More than 3 years have passed since last update.


起きた事象

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