PostgreSQL 8.2.xデータベースを別のサーバーに移行するタスクが与えられました。これを行うには、pgAdmin 1.12.2(ちなみにUbuntu 11.04)を使用し、カスタム/圧縮形式(.backup)とUTF8エンコードを使用したバックアップと復元を使用しています。
元のデータベースは、次のようにUTF8です。
-- Database: favela
-- DROP DATABASE favela;
CREATE DATABASE favela
WITH OWNER = favela
ENCODING = 'UTF8'
TABLESPACE = favela
CONNECTION LIMIT = -1;
移行先サーバーで、このようなデータベースを作成しています。しかし、復元オプションを使用して.backupファイルからデータベースを復元すると、次のエラーのいくつかが表示されます。
pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR: invalid byte sequence for encoding "UTF8": 0xe3a709
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT: COPY arena, line 62
実際にどのレコードがこのエラーをトリガーしたかを確認すると、vartextフィールドにはç(ポルトガル語で使用される「caça」など)のような発音区別記号があります。コピーにエラーがあると、このテーブルへのデータの挿入が停止するためです。そして、これを達成するためにそれらを一つ一つ手動で置き換えたくありません。
しかし、UTF8ではこの種の問題はないはずですから、ちょっと奇妙ですよね?
そもそも彼らがどうやってそこに着いたのか分かりません。私はデータベースを移行するだけです。データベースはどういうわけかLATIN1のようで、その後UTF8に不適切に変更されたと思います。
テーブル/データベースに無効なUTF8シーケンスがあるかどうかを確認する方法はありますか?または、これらの文字を強制的にUFT8に変換または再変換して、復元の実行時に問題が発生しないようにする方法はありますか?
前もって感謝します。