#概要
以前ブログにポストしたものの転載です。
色々検索すると、$PGCLIENTENCODINGをEUC-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に書き換える必要があります。
※今回は2G越えのdumpファイルでした。
-
nkfでUTF-8に変換
nkf -w euc.dump > utf-8.dump
-
viで文字コードの指定を変更(utf-8.dump)
- 変更前:SET client_encoding = 'EUC_JP';
- 変更後:SET client_encoding = 'UTF-8';
-
psqlでリストア
psql -U {PGUSER} -p {5432} -d {DBNAME} -f utf-8.dump > result.log 2>&1
-
リストア終了後、result.logを開いて少なくともERRORが出力されていないことを確認。
完了!