[pgsql-jp: 31246] Re: pg_dumpファイルのリストアエラー

Kawasaki -USB- Yusuke u-suke @ kawa.net
2003年 10月 21日 (火) 19:06:16 JST


今岡さん、

川崎と申します。こんにちは。(再送信)

文字コードを正しく設定していないと、絵文字や文字化けなどで
誤ったコードのままDBに格納されてしまい、ダンプ後のリストア時に 
Invalid EUC_JP character sequence エラーが発生してしまいます。

エラーのあるテーブルを除きながら個別にリストアしたり、
COPY 文を使わずに INSERT 文でリストアすることで
影響を最低限に抑える手順もありますが、ダンプしたファイルの
文字コードを修正する方法も考えられます。

このメールの末尾につけた remove-invalid-euc.pl は、
テキスト中の誤ったコードの文字を『〓』に変換する短いプログラムです。

$ perl remove-invalid-euc.pl < dump.txt > valid.txt

とすると、dump.txt 中の誤ったコードの文字を『〓』に変換します。
dump.txt の代わりに、ダンプしたファイル名を指定してください。
また、変換した該当行も表示されるので、確認にもなります。(STDERR)

valid.txt は誤ったコードはないため、リストアが可能になります。
変換件数が少ないようでしたら、そのままインポートしてしまうか、
valid.txt を『〓』に変換された個別に修正して対応できます。
変換件数が多いようでしたら、元データをどうにかしないといけませんね。

もともとDBからは誤ったコードのデータしか手元に取れない状態ですので
データは復元不可能(多少〓になっても構わない)という前提で利用するか、
または文字コードの誤っている行を検出するだけの目的で、利用できます。

# もちろん、今後は正しい文字コードを指定していれば、
# remove-invalid-euc.pl が登場する出番はなくなります。

以上、参考になれば。

In "[pgsql-jp: 31233] pg_dumpファイルのリストアエラー",
At 2003/10/20 12:39:12, "Imaoka Yumiko" <shinoi @ osk2.3web.ne.jp> wrote:
> テスト環境とあるユーザの環境では問題なく出来たのですが、
> 別のユーザの環境でinitdbの後、あらかじめpg_dumpでとっておいたデータファイルが
> リストアでエラーを起こしてしまいました。
> エラーが起きるのはデータベースの中のあるテーブルのみです。
> テーブルの内容をcopyコマンドで入れる際に下記のようなエラーメッセージが
> 表示されています。
> 
> psql:exist_4.out:338:ERROR:copy:line 7142, Invalid EUC_JP character sequence
> found(0x8043)
> 
> 0x8043が、データベースで使用している文字コードEUC_JPではないという旨の
> メッセージですが、今回の作業以前にも何度もユーザのpg_dumpファイルをリストアし、
> 該当するデータ行も含めて問題なくきたのにどうして今回のみこのようなエラーに
> なるのかが判りません。

---- Kawasaki Yusuke <u-suke @ kawa.net>

> ――――――――――――――――――――――――――――― <
> 株式会社 かっぺ            Kappe Inc. <
> ――――――――――――――――――――――――――――― <
> 〒260-0045 千葉県千葉市中央区弁天2-22-6 Kappe Bld.    <
> TEL:043-256-2726 FAX:043-256-2731 MAIL:support @ kappe.co.jp <
> ――――――――――――――――――――――――――――― <

添付ファイルは禁止のようですので、以下にコピー&ペーストしておきます。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#!/usr/bin/perl
# ------------------------------------------------------------------------
#   remove-invalid-euc.pl
#   Copyright 2003 Kawasaki Yusuke, Kappe Inc.
# ------------------------------------------------------------------------
#   "Invalid EUC_JP character sequence found" を回避するため、
#   標準入力からEUCコードのテキストを読み取って、
#   不正な文字コードがあれば『〓』に変換して標準出力に書き出します
#   変換行および COPY で始まる行は、確認用に標準エラー出力にも書き出します
# ------------------------------------------------------------------------
#   Usage: perl remove-invalid-euc.pl < input.txt > output.txt
# ------------------------------------------------------------------------
    use strict;
    my $GETA = "\xa2\xae";
# ------------------------------------------------------------------------
    while (<>) {
        my $changed = 0;
        print STDERR $_ if /^COPY /i;
        $changed ++ if ( s/[\x7f-\x8d\x8f-\x9f]/$GETA/sg );
        $changed ++ while ( s/(^|[\000-\177])((?:[\200-\377]{2})*)([\200-\377])([\000-\177]|$)/$1$2$GETA$4/s );
        print STDERR $_ if $changed;
        print $_;
    }
# ------------------------------------------------------------------------




pgsql-jp メーリングリストの案内