PostgreSQLの状態を知る
とあるクライアントから「データベースのソート結果が変なんだけど」という連絡をいただいた。自分が構築したシステムではないので完全にお気楽モードで調べて差し上げることにした。データベースはPostgreSQL、プログラム言語はPHP。他人が作ったデータベースを触るのは基本的に嫌だが、それでも頼っていただける、というのはありがたい。ということで・・・。
まずはプログラムのバグを疑った。しかし、それらしい問題というのは見当たらない。SQL出力を確かめたり、取得したデータを確かめたり。しかしいずれも整合性が取れている(整合性が取れているにもかかわらず、データの並びがおかしいとはこれ如何に)。
データベースのダンプも預かっていたので、画面に出力させたSQLを自分の環境でも実行してみた。
ん?、ん?、ん???。
先方のサーバと自分のサーバで表示される順番が違う???。なぜ???。
バージョンもほとんど同じなのだからこんなことないはずなのに、と思ったら思いついた点がひとつ。ロケール(locale)の設定だ。データベースで日本語を使用する場合はロケール設定を無効(というかCを指定)にしなければいけない、とかなんとかいう設定があったはず。
で、現在の状態を調べるにはどうすればよいのか調べてみた。
pg_controldata /var/lib/pgsql/data/
このコマンドでいろいろわかる!。ちなみに引数ではデータの場所を指定する。結果として、表示される値のうち「LC_CTYPE:」の値が「C」ではなかった。どうやら、データベースの初期化をきっちりやっていないことが原因らしい。「忘れた」のか「知らなかった」のかわからないけど、クライアントにはいちおう状態を説明。どんな反応をされるのか・・・。少しクライアントがかわいそう。構築した業者さん・・・ハズレだったんだなぁ。