備忘録です
PostgreSLQにおいて日本語を扱う場合にはエンコーディングだけではなくロケールも正しく扱う必要がある。
ロケールが正しくないと、日本語文字列に対する=演算子や並び替えにおいて正しい結果が得られなくなる。
たとえばwhere句で=演算子を使用して日本語の条件を指定しても、
予想通りの結果が得られなくなる(全件が検索結果として帰ってくる等)。
これは=演算子などはロケールを考慮するため、ロケールが正しくないと、比較も当然正しく行われない。 (ただlike演算子はロケールを無視する)
PostgreSQLのロケールはデータベースシステム全体で共有され、pg_catalogテーブルや、 pg_controldataコマンドで確認することができる。またロケールはinitdbコマンドを利用して変更することができる。
結論:PostgreSQLではロケールは使用しない(no_locale)ほうが無難
参考資料:
http://postgresql.jp/ (日本PostgreSQLユーザー会内の各バージョンのマニュアル、
項目「多言語対応」)
http://ml.postgresql.jp/pipermail/pgsql-jp/ (メーリングリストの書庫内に類似の質問多数あり)