犬問題解決?
週休日。
某データベースの犬問題の解決に向けて、試行錯誤。以下は自分用メモとしての試行錯誤の記録であって、まとまったドキュメントではないのであしからず。
ターミナルで検索する分には問題ないけど、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の手順だけやればよいはず。