蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

犬問題解決?

週休日。
某データベースの犬問題の解決に向けて、試行錯誤。以下は自分用メモとしての試行錯誤の記録であって、まとまったドキュメントではないのであしからず。
ターミナルで検索する分には問題ないけど、phpから検索するとダメ。よくわからないけど、とにかくテストはphpで行う。
initdbのやりなおし(参考にさせていただいたページ:304 - narucissus is Not Modified: PostgreSQLのソート順がおかしいためロケール再設定とinitdbやり直し)。これは、以前もやったはずだけど……。

1. データのバックアップ
2. DBを停止
% sudo su postgres -c \
 '/opt/local/lib/postgresql84/bin/pg_ctl -D /opt/local/var/db/postgresql84/defaultdb stop'
3. initdbやり直し
% cd /opt/local/var/db/postgresql84/
% sudo mv dafaultdb defaultdb_old
% sudo mkdir defaultdb
% sudo chown postgres:postgres defaultdb
% sudo chmod 700 defaultdb
% sudo su postgres -c \
 '/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb --no-locale'
4. DBの起動
% sudo su postgres -c \
 '/opt/local/lib/postgresql84/bin/pg_ctl -D /opt/local/var/db/postgresql84/defaultdb start'
5. データのリストア
% /opt/local/lib/postgresql84/bin/psql -U postgres template1 < backup

テストするとこれでもまだダメ。

6. 再initdb

もう一度ウェブで調べ直して、encodingの指定をしていなかったことに気づく。というわけでもう一度initdbからやりなおし。

% sudo su postgres -c \
'/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb --no-locale --encoding=EUC_JP'

これでもダメ。"psql -l"してみると、目的のデータベースがEUC_JPになっていない。なんとなればpg_dumpallしたときに以前のencode(SQL_ASCII)でダンプされ、リストアしたときにSQL_ASCIIになってしまうから。

7. pg_dump、dropdb、createdb、リストア

ダンプするときに、encodingを指定すればよい。

% /opt/local/lib/postgresql84/bin/pg_dump \
 hoge -U hoge --encoding=EUC_JP --oids > filename
% /opt/local/lib/postgresql84/bin/dropdb hoge -U hoge
% /opt/local/lib/postgresql84/bin/createdb \
 hoge -U hoge --encoding=EUC_JP
% /opt/local/lib/postgresql84/bin/psql -U hoge < filename

できた〜。「犬」で検索したら、ちゃんと「犬」だけがヒットする。
というわけで、7の手順だけやればよいはず。