postgresでvarcharのソート順が文字列ソートじゃなくて数値ソートみたいになっていた。
collate "C"
をorder句に追加すればバイトオーダーでソートしてくれ、意図した順にソートされた。
postgres=# select name from test order by name; name ------ あ い ああ いい (4 rows) postgres=# select name from test order by name collate "C"; name ------ あ ああ い いい (4 rows)
遭遇したエラー、参考URLなど
postgres=# select name from test order by name collate "ja_JP"; ERROR: collation "ja_JP" for encoding "UTF8" does not exist
postgres=# create collation "ja_JP.utf8" (LOCALE = 'ja_JP.UTF-8'); ERROR: could not create locale "ja_JP.UTF-8": Success
- library/postgres - Docker Hub
- Dockerコンテナ。ロケールを追加するのが面倒っぽい
- PostgreSQLのロケール(lc collate,lc ctype)の確認と変更
- DBをダンプ/リストアするなら手軽かも。ちょっと状況が合わなかった。
- 関連して、PostgreSQL で参照(リードオンリー)モード が今後使えそう
- PostgreSQL: Documentation: 9.1: Collation Support
- Herokuのpostgresで日本語カラムのソートが正しくできない - QA@IT
COLLATE "C"
についての言及
- postgresql - Order varchar string as numeric - Stack Overflow
- 始め数値としてソートするなら、という調べ方をしていた
- ロケール(国際化と地域化) | Let's Postgres
- 説明色々
- sql - purpose of collate in Postgres - Stack Overflow
COLLATE "C"
の説明
- PostgreSQLのDockerイメージの使い方 - SIerだけど技術やりたいブログ
docker-compose exec db bash
でlocaledef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
を試すも効果なく。- 他の記事も参考になりそうなものが多い
- PostgreSQL: pg9.4b1: unhelpful error message when creating a collation
- シェルでの
locale -a
とpsqlでの\dOS+
が同じって書いてあるが違った。pg_catalogに追加するのが難しそう
- シェルでの