1. ホーム
  2. postgresql

[解決済み] エンコーディング "UTF8" のための無効なバイト列

2022-06-26 07:55:55

質問

私は データをインポートしようとしている をデータベースにインポートしようとしています。そこで、一時的なテーブルを作成しました。

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

そして今、インポートしようとしているのは データを ,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

しかし、その後、エラーが発生します。

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

どのように修正すればいいのでしょうか?データベース全体のエンコーディングを変更する必要がありますか (必要な場合、どのように?)? tmp テーブルのエンコーディングだけを変更できますか?または、ファイルのエンコーディングを変更する必要がありますか?

どのように解決するのですか?

データベースにUTF8データを格納する必要がある場合、UTF8を受け入れるデータベースが必要です。データベースのエンコーディングは pgAdmin で確認することができます。データベースを右クリックし、[プロパティ]を選択するだけです。

しかし、このエラーは、ソースファイルに無効な UTF8 データがあることを告げているようです。つまり copy ユーティリティが、あなたが UTF8 ファイルを与えていることを検出または推測したことを意味します。

Unix の何らかのバージョンで実行している場合、エンコーディングを (多かれ少なかれ) チェックすることができます。 file ユーティリティでチェックできます。

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Macでもターミナルで動くと思います。) Windowsでのやり方は不明です。

Windows システムから来たファイルにその同じユーティリティを使用する場合 (つまり、ファイルが ではない でないファイル) に対して同じユーティリティを使用すると、おそらく次のようなものが表示されます。

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

もし奇妙なことが続くようなら、入力データを既知のエンコーディングに変換するか、クライアントのエンコーディングを変更するか、あるいはその両方を試してみるとよいでしょう。(私たちは、エンコーディングに関する私の知識の限界を本当に引き伸ばしています)。

を使用することができます。 iconv ユーティリティを使って、入力データのエンコーディングを変更することができます。

iconv -f original_charset -t utf-8 originalfile > newfile

の説明に従って、psql(クライアント)のエンコーディングを変更することができます。 文字セットサポート . そのページで、"To enable automatic character set conversion"というフレーズを検索してください。