QA@IT

Herokuのpostgresで日本語カラムのソートが正しくできない

6694 PV

Heroku + Rails3で単純なサーバーアプリの開発をしています。
DBのレコードを日本語カラムでソート(order by)して取得しようとしているのですが、以下のような不可解なならび順になってなってしまいます。

SQL> create table Test ( title text primary key )
(略)
SQL> select * from Test order by title;
+--------+
| title  |
+--------+
| あああ    |
| あいう    |
| あああA   |
| ABC    |
| あいうABC |
| あああ亜   |
| あいう亜   |
+--------+

おそらく、PostgreSQLのinitdbかcreatedb時に指定するLocaleの問題だと思いますが、Heroku + Railsの場合、それはどのように設定すればよいのでしょうか?

回答

Heroku Postgresでの話になりますが、CREATE TABLEALTER TABLEの際にカラム毎にCロケールを設定してバイトオーダーで比較されるようにしています。

ロケールを設定していない場合:

$ heroku pg:psql
=> CREATE TABLE tmp1 (title TEXT PRIMARY KEY);
(snip)
=> SELECT * FROM tmp1 ORDER BY title;
   title   
-----------
 あああ
 あいう
 あああA
 ABC
 あいうABC
 あああ亜
 あいう亜
(7 rows)

COLLATEでCロケールを設定した場合。

$ heroku pg:psql
=> CREATE TABLE tmp2 (title TEXT PRIMARY KEY COLLATE "C");
(snip)
=> SELECT * FROM tmp2 ORDER BY title;
   title   
-----------
 ABC
 あああ
 あああA
 あああ亜
 あいう
 あいうABC
 あいう亜
(7 rows)

カタカナや濁音が混じってくると日本語ロケールのほうがいいのですが、Heroku Postgresではどうも設定できないようなので、Cロケールで妥協しています。

編集 履歴 (1)
  • ありがとうございます!なるほど。カラムのCOLLATEで指定するのですね。カタカナや濁音は仕方が無さそうですね…。 -
  • 同じ問題にぶつかったのですが、
    SELECT するときに `ORDER BY title COLLATE "C"` みたいな指定もできました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。