2009年10月22日木曜日

PostgreSQLをEUC-JPからUTF-8環境に移行する!

色々検索すると、$PGCLIENTENCODINGをUTF-8EUC-JPにして普通にpsqlから流し込めば完了っていうのが良く引っかかったけど、実際に試してみると以下のエラーが発生しました。

ERROR: character 0xfaf0 of encoding "EUC_JP" has no equivalent in "UTF8"

なんかEUC-JPの0xFAF0っていう文字をUTF-8に変換できないよというエラー。
このエラーメッセージの下には該当テーブル名が表示されていて、そのテーブルにはレコードが1件もリストアされていませんでした(当然か)
PostgreSQLメーリングリストのアーカイブ等を探ってみるとPostgreSQLの文字変換マップが云々とのことです。

リストアしたいレコード数は数百件とかのレベルでは無かったので手作業で対応するのは不可能。
どうしようかな~と色々考えた結果、pgdumpしたダンプファイルの文字コードをnkfを使ってUTF-8に変換後、psqlで流し込めば問題なくリストアできました。
ただし、dumpファイルの先頭にクライアントエンコードはEUC-JPです、と記述されているので、それをUTF-8に書き換える必要があります。
最近のLinux環境ならviで開いて編集できるっぽいです。
※今回は2G越えのdumpファイルでした。

1.nkfでUTF-8に変換
nkf -w euc.dump > utf-8.dump

2.viで文字コードの指定を変更(utf-8.dump)
■変更前:SET client_encoding = 'EUC_JP';
■変更後:SET client_encoding = 'UTF-8';

3.psqlでリストア
psql -U {PGUSER} -p {5432} -d {DBNAME} -f utf-8.dump > result.log 2>&1

4.リストア終了後、result.logを開いて少なくともERRORが出力されていないことを確認。

あとはプログラムの文字コードだ!

2009年10月17日土曜日

Wikipediaの「数」に関する記事について

皆さんWikipediaはご存知だと思います。
で、Wikipediaには「数」についての記事も当然あります。
ふと「いくつまで記事が書かれているんだろう?」と思ったので調べてみました。
2分探索っぽく手作業で調べたので、途中で抜けたりしている数があるかもしれませんが、原則50000(五万)までっぽいです。

・・・手作業で登録してるんじゃないよな、多分・・・
でも何で50000なんだろうな~