[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 メーリングリストの案内