web-dev-qa-db-ja.com

エンコーディング 'WIN1252'のバイトシーケンス0x9dの文字には、エンコーディング 'UTF8'に相当するものがありません

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'に相当するものがありません。

この問題の原因と解決方法を教えてください。

16
Sahil Doshi

問題はそれです 0x9Dは、WIN1252では有効なバイト値ではありません。ここに表があります: https://en.wikipedia.org/wiki/Windows-1252

問題は、UTF-8ファイルをインポートしていて、postgresqlがデフォルトでWindows-1252になっていることです(これは多くのWindowsシステムのデフォルトです)。

chcp を指定してスクリプトを実行する前に、Windowsコマンドラインの文字セットを変更する必要があります。または、postgresqlでは次のことができます。

SET CLIENT_ENCODING TO 'utf8';

ファイルをインポートする前。

35
Philip Couling

エンコードには、有効なコードの数値範囲があります。データがwin1252エンコーディングになっていますか?

Postgresは非常に厳密であり、エンコードされた壊れたファイルをインポートしません。トレラントモードで動作するiconvを使用でき、壊れた文字を削除できます。 iconvでクリーニングした後、ファイルをインポートできます。

1
Pavel Stehule

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
0
isapir