まーのすけRoom

忘れると後で困りそうなことをMemoしておきます…

PostgrSQLの50音ソートが変

2011-04-28 00:26:12 | Mac
MacPortsで入れたPostgreSQL 9の50音ソートが変なことに気付いた。
あめ
いか
あずき
うさぎ
かもめ
あらかわ
えのしま
の様に文字数の順番で並んでいる。

ロケールの設定がおかしいとこうなるらしい。
pg_controldataで調べるとLC_COLLATE、LC_TYPEがen_US.UTF-8になっているとネットには書かれていたが、
/opt/local/lib/postgresql90/bin/pg_controldata /opt/local/var/db/postgresql90/defaultdb
をしてもそんな項目は出て来なかった。PostgreSQL9で出力内容が変わったのか?
PostgreSQL 8.1.23のサーバーでpg_controldataをチェックしたら
LC_COLLATE: ja_JP.UTF-8
LC_CTYPE: ja_JP.UTF-8
と出た。

解決方法は --no-local を付けて initdb をすると良いそうで、pg_dumpall でDBをバックアップして、DBを停止させ、DBのデータフォルダ(ウチのMacは/opt/local/var/db/postgresql90/defaultdb)をリネームして、
initdb -D /opt/local/var/db/postgresql90/defaultdb --no-local
DBをスタートさせ
psql -f [pg_dumpallしたデータ] postgres
でDBデータを読込み、元通りに。

50音ソートの結果は
あずき
あめ
あらかわ
いか
うさぎ
えのしま
かもめ
と正しくなった!

【2011.4.26追記】
別のMacで上記の様にやっても50音ソートがうまくいかず、--no-locale の前に -E UTF8 を追加して、
initdb -D /opt/local/var/db/postgresql90/defaultdb -E UTF8 --no-locale
としたら50音ソートがうまくいく様になった。

【2011.4.27追記】
initdb --no-locale
とすると、templateが
Encoding:SQL_ASCII Collation:C Ctype:C
で作られる。
この場合はcreatedb時に
createdb -E UTF8 -T template0 [DB名]
とすると、新しいデータベースが
Encoding:UTF8 Collation:C Ctype:C
で作られる。

2011.4.26追記の様に
initdb -E UTF8 --no-locale
とすると、templateが
Encoding:UTF8 Collation:C Ctype:C
で作られるので、新しいデータベースは普通に
createdb -E UTF8

Encoding:UTF8 Collation:C Ctype:C
になる。

どちらにしても、Collation:C にならないと50音ソートが期待した通りにならないので、
とりあえずこのどちらかを使って様子見する事にします。

【2011.4.28追記】
initdb コマンドで --locale=C と --no-locale は同じ意味だそう。
http://lets.postgresql.jp/documents/technical/text-processing/2



最新の画像もっと見る