PostgreSQLの日本語のデータが入ったカラムでソートすると順番がおかしくなるのはエンコードの影響

PostgreSQLの日本語のデータが入ったカラムでソートすると順番がおかしくなるのはエンコードの影響です。(タイトルで言い切った。)

解決策1

convert_toを使う

SELECT 
    t0.ACL_TYPE,
    t0.FEATURE_ALIAS_NAME,
    t0.FEATURE_NAME,
    t0.FEATURE_ID
FROM
    eip_t_acl_portlet_feature t0
ORDER BY convert_to(t0.FEATURE_ALIAS_NAME,'UTF8')

解決策2

手元の環境では意図したソート順にならなかった。

SELECT 
    t0.ACL_TYPE,
    t0.FEATURE_ALIAS_NAME,
    t0.FEATURE_NAME,
    t0.FEATURE_ID
FROM
    eip_t_acl_portlet_feature t0
ORDER BY t0.FEATURE_ALIAS_NAME COLLATE "ja_JP.UTF-8"

手元の環境ではこのように指定することでうまくいきました。

ORDER BY t0.FEATURE_ALIAS_NAME COLLATE "C"

なお、以下のようなエラーが出ることがあります。

ERROR: collation "ja_JP.utf8" for encoding "UTF8" does not exist

collationで指定するのは大文字・小文字、ハイフンとか厳密に見ているっぽいです。

照会順序を調べます。

SHOW LC_COLLATE;

インストールされている照合順序を調べます。

SELECT * from pg_collation;

参考

http://qiita.com/anoworl/items/af9f12f915b8969ea40d

http://se.ykysd.com/2015/09/28/orderby/