1. anoworl

    Posted

    anoworl
Changes in title
+PostgreSQLで正しく文字列ソート出来ない時の解決方法
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,71 @@
+## はじめに
+PostgreSQLで文字列カラムにてORDER BYを使いソートすると、並び順がむちゃくちゃ。けれど、ローカルでは問題無かったはず……。そんな時の解決方法です。
+私はHeroku Postgresを使用していて遭遇しました。ここではこちらを例に挙げてご説明します。
+
+## 原因
+照合順序が正しくしていされていないことが原因と考えられます。
+
+(Herokuの場合は以下で直接DBに接続出来ます)
+
+```bash
+$ heroku pg:psql
+```
+
+なるほどね。
+
+```postgres
+=> SHOW LC_COLLATE;
+ lc_collate
+-------------
+ en_US.UTF-8
+(1 行)
+```
+
+## 調査
+インストールされている照合順序の中から、お好みのものを選びましょう。
+
+```postgres
+=> SELECT * FROM pg_collation;
+```
+
+## 解決方法
+### 1. ソート時に照合順序を指定
+ALTERをかける必要も無く楽です。クエリのORDER BYにて照合順序を指定します。
+
+```postgres
+ORDER BY title DESC
+```
+
+となっているのを、
+
+```postgres
+ORDER BY title COLLATE "ja_JP.utf8" DESC
+```
+
+と変更
+
+### 2. スキーマを変更し特定カラムの照合順序を変更
+逆にこちらはクエリに手を入れる必要が無く楽です。
+
+```postgres
+=> ALTER TABLE items ALTER COLUMN title TYPE VARCHAR COLLATE "utf8";
+```
+
+これで大丈夫。確認です。
+
+```postgres
+=> \d items
+```
+
+出来ましたね。
+
+```postgres
+title | character varying | 照合順序 ja_JP.utf8
+```
+
+## おわりに
+Heroku Postgresで \l すると共有スペース時代を思い出せます。
+
+## 参考文献
+- [Herokuのpostgresで日本語カラムのソートが正しくできない - QA@IT](http://qa.atmarkit.co.jp/q/2205)
+- [Set locale on Heroku postgres](http://stackoverflow.com/questions/12334986/set-locale-on-heroku-postgres)