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が出力されていないことを確認。
あとはプログラムの文字コードだ!