SQLスクリプトでcsvファイルを読み取り、そのデータをpostgre SQLテーブルにコピーしています。コード行は次のとおりです。
\copy participants_2013 from 'C:/Users/Acrotrend/Desktop/mip_sahil/mip/reelportdata/Participating_Individual_Extract_Report_MIPJunior_2013_160414135957.Csv' with CSV delimiter ',' quote '"' HEADER;
次のエラーが発生しています:エンコーディング 'WIN1252'のバイトシーケンス0x9dの文字には、エンコーディング 'UTF8'に相当するものがありません。
この問題の原因と解決方法を教えてください。
問題はそれです 0x9D
は、WIN1252では有効なバイト値ではありません。ここに表があります: https://en.wikipedia.org/wiki/Windows-1252
問題は、UTF-8ファイルをインポートしていて、postgresqlがデフォルトでWindows-1252になっていることです(これは多くのWindowsシステムのデフォルトです)。
chcp を指定してスクリプトを実行する前に、Windowsコマンドラインの文字セットを変更する必要があります。または、postgresqlでは次のことができます。
SET CLIENT_ENCODING TO 'utf8';
ファイルをインポートする前。
エンコードには、有効なコードの数値範囲があります。データがwin1252エンコーディングになっていますか?
Postgresは非常に厳密であり、エンコードされた壊れたファイルをインポートしません。トレラントモードで動作するiconv
を使用でき、壊れた文字を削除できます。 iconv
でクリーニングした後、ファイルをインポートできます。
encoding 'UTF-8'
コマンドでエンコードとして\copy
を指定するだけです。 (読みやすくするために2行に分割しましたが、すべて同じ行に置いてください):
\copy dest_table from 'C:/src-data.csv'
(format csv, header true, delimiter ',', encoding 'UTF8');
詳細:
問題は、クライアントエンコーディングがWIN1252
に設定されていることです。これは、Windowsマシンで実行されているが、ファイルにUTF-8
文字が含まれているためと考えられます。
クライアントエンコーディングは次の方法で確認できます。
SHOW client_encoding;
client_encoding
-----------------
WIN1252