22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

#概要
以前ブログにポストしたものの転載です。
色々検索すると、$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ファイルでした。

  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が出力されていないことを確認。

完了!

22
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?