「UTF8」をエンコードするための無効なバイトシーケンス


124

私はよ、いくつかのデータをインポートしようとしている私のデータベースに。一時テーブルを作成しました

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テーブルのエンコードのみを変更できますか?または、ファイルのエンコーディングを変更する必要がありますか?


インポート時にエンコードオプションを変更します。私は "Windows-1251"に設定しましたが、問題なく動作しました。
ブライアンD

1
@BrianDに感謝します。私もこの問題に直面していましたが、これでうまくいきました。
gouravkr

回答:


109

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

しかし、そのエラーは、ソースファイルに無効なUTF8データが含まれていることを示しているようです。これは、copyユーティリティがUTF8ファイルをフィードしていることを検出または推測したことを意味します。

Unixのバリアントで実行している場合は、fileユーティリティを使用して(多かれ少なかれ)エンコーディングを確認できます。

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(ターミナルのMacでも動作すると思います。)Windowsでそれを行う方法はわかりません。

Windowsシステムからのファイル(つまり、UTF8でエンコードされていないファイル)で同じユーティリティを使用すると、おそらく次のようになります。

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

奇妙なままの場合は、入力データを既知のエンコーディングに変換するか、クライアントのエンコーディングを変更するか、またはその両方を試みます。(私たちは、エンコーディングに関する私の知識の限界を本当に広げています。)

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

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

Character Set Supportの指示に従って、psql(クライアント)エンコーディングを変更できます。そのページで、「文字セットの自動変換を有効にするには」というフレーズを検索します。


3
ファイルはASCIIですが、アクセント付き文字が含まれているので、間違いでしょうか?
mpen 2011

2
この答えは受け入れられますが、問題は実際にはデータ(更新されたQ)にあったと思います。
mpen 2011

1
私はこれが役に立ったと感謝しました。ちなみに、OS X端末でも動作します
Raul Rene

1
これは私にとってはうまくいきましたが、少し異なる方法で。「iconv」コマンドは実際にファイルを爆破しましたが、問題がどこにあるのかは正しくありませんでした。奇妙な種類の「-」文字です。とにかく、私はそれを削除し、私のファイルはpostgresにロードすることができました。先端をありがとう!
trip0d199 2017年

1
他の人や検索エンジンを助けるために:これは、読み取り不可能な文字を含むストライプCSVエクスポートをUTF-8に変換するために機能します: `iconv -f ISO-8859-15 -t utf-8 Customers.csv> Customers-utf8.csv`
sscarduzio 2017年

57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

encoding私の場合、オプションを追加するとうまくいきました。


1
エラーなしで完了します。有用な結果が得られる場合と得られない場合があります。データの意図されたエンコーディングを知る必要があります。
Jasen

1
私のシナリオでは、上記のクエリはどのように機能しましたか?UTF8でエンコードされたcsvファイルとUTF8でエンコードされたDBがあります。
Ajay Takur 2017年

14

どうやら、オンザフライでエンコーディング設定できます。

 set client_encoding to 'latin1'

その後、クエリを再実行します。ただし、どのエンコーディングを使用すればよいかわからない。


latin1文字を読みやすくしましたが、ほとんどのアクセント付き文字は大文字になっていて、本来あるべきではありませんでした。これはエンコーディングが悪いためだと思っていましたが、実際はデータがただ悪かっただけだと思います。最終的にはlatin1エンコーディングを維持しましたが、データを前処理し、大文字と小文字の問題を修正しました。


興味深いことに、SELECTステートメントでエラーが発生しました。これはそれを解決しました。データベース自体ではなく、エラーを発生させたのは私のpsql クライアントだからです。(そもそもデータを拒否した場合、エンコードは禁止されていました。)
ワイルドカード

14

変換できない文字を破棄しても問題ない場合は、-cフラグを使用できます

iconv -c -t utf8 filename.csv > filename.utf8.csv

そして、それらをテーブルにコピーします


Macではそれはiconv -c -t UTF-8 filename.csv > filename.utf8.csv私のためだった
マイケル

8

このエラーは、ファイル内のレコードエンコーディングが接続に関して異なることを意味します。この場合、// IGNOREフラグにもかかわらず、iconvがエラーを返すことがあります。

iconv -f ASCII -t utf-8 // IGNORE <b.txt> /a.txt

iconv:位置(一部の番号)での不正な入力シーケンス

トリックは、正しくない文字を見つけて置き換えることです。Linuxでこれを行うには、「vim」エディターを使用します。

vim(テキストファイル)、「ESC」ボタンを押して「:goto(iconvによって返される番号)」と入力します。

非ASCII文字を検索するには、次のコマンドを使用できます。

grep --color = 'auto' -P "[\ x80- \ xFF]"

正しくない文字を削除する場合は、ファイルを変換する必要があるかどうかを確認してください。おそらく問題はすでに解決されています。


iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
Jasen

5

pgadminでこの問題を解決するには、以下の手順に従ってください:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;


4

インポートファイルを生成したマシン/エンコーディングのタイプによって異なります。

英語版または西ヨーロッパ版のWindowsから取得している場合は、おそらく 'WIN1252'に設定することをお勧めします。別のソースから取得している場合は、ここで文字エンコードのリストを確認してください。

http://www.postgresql.org/docs/8.3/static/multibyte.html

Macから取得する場合は、最初に「iconv」ユーティリティを実行して、MacRomanからUTF-8に変換する必要があります。


4

まあ私は同じ問題に直面していた。そして私の問題を解決したのはこれです:

Excelで[名前を付けて保存]をクリックします。 [ ファイルの種類]から[ .csv]を選択します。[ ツール]をクリックします。次に、ドロップダウンリストからWebオプションを選択します。下でエンコードタブ、として文書を保存したUnicode(UTF-8) 。OKをクリックします。ファイルを保存します。できました!


3

私は同じ問題を抱えており、ここで良い解決策を見つけました:http : //blog.e-shell.org/134

これは、データベースエンコーディングの不一致が原因です。SQLダンプを取得したデータベースはSQL_ASCIIとしてエンコードされ、新しいデータベースはUTF8としてエンコードされているためです。.. Recodeは、所定のファイルのエンコーディングをオンザフライで変更できるGNUプロジェクトの小さなツールです。

だから私はそれを再生する前にダンプファイルを再コード化しました:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

DebianまたはUbuntuシステムでは、パッケージを使用してrecodeをインストールできます。



2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

これを試してUTF8エンコーディングを処理できます。


2

PHPでこの問題を解決する短い例-

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

エラーの詳細:上記の入力を列に渡そうとすると、POSTGRESデータベースはUTF-8文字以外を処理しないため、「UTF8をエンコードするための無効なバイトシーケンス:0xab」というエラーが発生します。

したがって、POSTGRESデータベースに挿入する前に、その値をUTF-8に変換するだけです。


2

同じ問題がありました。ファイルがUTF-8としてエンコードされていませんでした。notepad ++でファイルを開き、ファイルのエンコードを変更することで解決しました。

「エンコーディング」に移動し、「UTF-8に変換」を選択します。変更を保存すればそれだけです!


1

このエラーは、入力データにエスケープ文字自体が含まれている場合に発生することがあります。デフォルトでは、エスケープ文字は「\」記号なので、入力テキストに「\」文字が含まれている場合は、ESCAPEオプションを使用してデフォルト値を変更してみてください。


1

Pythonの場合は、使用する必要があります

クラスpg8000.types.Bytea(str)Byteaは、PostgreSQLバイト配列にマップされるstr派生クラスです。

または

Pg8000.Binary(値)バイナリデータを保持するオブジェクトを構築します。


1

私はWindowsでこの問題に遭遇しましたが、psql(グラフィカルツールなし)のみで作業していました。この問題を修正するには、psql(クライアント)のデフォルトのエンコーディングをPostgreSQLサーバーのデフォルトのエンコーディングと一致するように永続的に変更します。CMDまたはPowershellで次のコマンドを実行します。

setx PGCLIENTENCODING UTF8

変更を有効にするには、コマンドプロンプト/ Powershellを閉じて再度開きます。

メモ帳でファイルを開き、[ファイル]-> [名前を付けて保存]を選択して、バックアップファイルのエンコードをUnicodeからUTF8に変更します。[エンコーディング]ドロップダウンをUnicodeからUTF8に変更します。(また、バックアップファイルの名前に.txt拡張子が追加されないように、[ファイルの種類]を[テキストドキュメント(.txt)]から[すべてのファイル]に変更します)。これで、バックアップを復元できるはずです。


0

このエラーでは、フィールドが暗号化されている可能性もあります。正しい表を見ていることを確認してください。場合によっては、管理者が代わりに使用できる暗号化されていないビューを作成することがあります。最近、非常によく似た問題が発生しました。


0

Excelで生成されたcsvをPostgresテーブルにコピーしようとしたときにも同じエラーが発生しました(すべてMacの場合)。これは私がそれを解決した方法です:

1)Atom(私が使用するIDE)でファイルを開きます

2)ファイルに重要でない変更を加えます。ファイルを保存します。変更を元に戻します。もう一度保存します。

プレスト!コピーコマンドが機能するようになりました。

(私はアトムがうまくいったフォーマットでそれを保存したと思います)


0

Notepad ++でファイルCSVを開きます。メニューEncoding\を選択しEncoding in UTF-8、手動でいくつかのセルを修正します。

その後、インポートを再試行してください。


0

CSVがSQL Serverからエクスポートされる予定で、サイズが大きく、Unicode文字が含まれている場合は、エンコードをUTF-8次のように設定してエクスポートできます。

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

次のページでは、テーブルからデータをコピーするか、クエリを作成するかを尋ねます。テーブルにcharまたはvarcharデータタイプがある場合は、クエリオプションを選択し、それらの列をとしてキャストしますnvarchar(max)。たとえばmyTable、最初の列varcharと2番目の列の2つの列がある場合、最初の列を次のようintにキャストしnvarcharます。

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.