私は データをインポートしようとしています 私のデータベースにいます。そこで、一時テーブルを作成しました。
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
name__テーブルのエンコーディングのみを変更できますか?または、ファイルのエンコーディングを変更しようとする必要がありますか?
データベースにUTF8データを保存する必要がある場合は、UTF8を受け入れるデータベースが必要です。データベースのエンコーディングはpgAdminで確認できます。データベースを右クリックして、「プロパティ」を選択します。
しかし、このエラーは、ソースファイルに無効なUTF8データがあることを示しているようです。これは、copy
ユーティリティがUTF8ファイルを供給していることを検出または推測したことを意味します。
Unixのバリアントで実行している場合は、 file
ユーティリティを使用してエンコードを(多少は)確認できます。
$ file yourfilename
yourfilename: UTF-8 Unicode English text
(これは端末のMacでも機能すると思います。)Windowsでそれを行う方法がわかりません。
Windowsシステムから来たファイル(つまり、UTF8でエンコードされたnotのファイル)で同じユーティリティを使用すると、おそらく何かが表示されますこのような:
$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators
異常な状態が続く場合は、入力データを既知のエンコードに変換するか、クライアントのエンコードを変更するか、またはその両方を試みます。 (エンコーディングに関する私の知識の限界を本当に広げています。)
iconv
ユーティリティを使用して、入力データのエンコードを変更できます。
iconv -f original_charset -t utf-8 originalfile > newfile
文字セットサポート の指示に従って、psql(クライアント)エンコーディングを変更できます。そのページで、「文字セットの自動変換を有効にするには」というフレーズを検索します。
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';
私の場合、encoding
オプションを追加するとうまくいきました。
どうやら エンコードの設定 実行中に、
set client_encoding to 'latin1'
そして、クエリを再実行します。ただし、どのエンコーディングを使用する必要があるかはわかりません。
latin1
は文字を読みやすくしましたが、アクセント記号付き文字のほとんどは本来あるべきではない大文字でした。これはエンコードが悪いためだと思っていましたが、実際にはデータが悪いだけだったと思います。最終的にlatin1エンコーディングを維持することになりましたが、データを前処理し、大文字と小文字の問題を修正しました。
変換できない文字を破棄しても問題ない場合は、-c
フラグを使用できます
iconv -c -t utf8 filename.csv > filename.utf8.csv
そして、それらをテーブルにコピーします
このエラーは、ファイル内のレコードエンコーディングが接続に関して異なることを意味します。この場合、// 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]"
間違った文字を削除する場合は、ファイルを本当に変換する必要があるかどうかを確認してください。おそらく問題はすでに解決されています。
インポートファイルを生成したマシン/エンコーディングのタイプによって異なります。
英語版または西ヨーロッパ版のWindowsから取得する場合、おそらく「WIN1252」に設定するのが最善の策です。別のソースから取得する場合は、次の文字エンコードのリストを参照してください。
http://www.postgresql.org/docs/8.3/static/multibyte.html
Macから取得する場合は、最初に「iconv」ユーティリティで実行して、MacRomanからUTF-8に変換する必要があります。
まあ、私は同じ問題に直面していました。そして、私の問題を解決したのはこれです:
Excelで[名前を付けて保存]をクリックします。タイプとして保存から、。csvを選択しますToolsをクリックします。次に、ドロップダウンリストからweb optionsを選択します。 エンコードタブで、ドキュメントをnicode(UTF-8)として保存します。 OKをクリックします。ファイルを保存します。完了!
私は同じ問題を抱えていて、ここでニースの解決策を見つけました: 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をインストールできます。
バックスラッシュ文字をパイプ文字など、sedと置き換えることができます。
sed -i -- 's/\\/|/g' filename.txt
以下の手順に従って、pgadminでこの問題を解決してください。
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
Pythonの場合、使用する必要があります
クラスpg8000.types.Bytea(str)Byteaは、PostgreSQLバイト配列にマップされるstr派生クラスです。
または
Pg8000.Binary(値)バイナリデータを保持するオブジェクトを構築します。
PHPでこの問題を解決する短い例-
$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);
エラーの詳細:POSTGRESデータベースは、上記の入力を列に渡そうとするとUTF-8文字以外を処理しないため、「UTF8をエンコードするための無効なバイトシーケンス:0xab」というエラーを返します。
そのため、この値をPOSTGRESデータベースに挿入する前にUTF-8に変換するだけです。
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';
これを試してUTF8エンコーディングを処理できます。
入力データ自体にエスケープ文字が含まれている場合、このエラーが発生する可能性があります。デフォルトでは、エスケープ文字は「\」記号です。したがって、入力テキストに「\」文字が含まれている場合は、ESCAPEオプションを使用してデフォルト値を変更してください。
このエラーでは、フィールドが適切に暗号化されている可能性もあります。必ず正しい表を確認してください。場合によっては、管理者が暗号化されていないビューを作成し、代わりに使用できます。私は最近、非常によく似た問題に遭遇しました。
Notepad ++でCSVファイルを開きます。メニューEncoding
\Encoding in UTF-8
を選択し、いくつかのセルを手動で修正します。
その後、インポートを再試行してください。
Excelで生成されたcsvをPostgresテーブル(すべてMac)にコピーしようとしたときに、同じエラーが発生しました。これは私がそれを解決した方法です:
1)Atom(使用するIDE)でファイルを開きます
2)ファイルにわずかな変更を加えます。ファイルを保存します。変更を元に戻します。もう一度保存します。
プレスト!コピーコマンドが動作するようになりました。
(Atomはそれを機能する形式で保存したと思います)