urutan byte tidak valid untuk encoding "UTF8"


125

Saya mencoba mengimpor beberapa data ke database saya. Jadi saya telah membuat tabel sementara,

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

Dan sekarang saya mencoba mengimpor data ,

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

Tapi kemudian saya mendapatkan kesalahan,

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

Bagaimana cara memperbaikinya? Apakah saya perlu mengubah pengkodean seluruh database saya (jika ya, bagaimana?) Atau dapatkah saya mengubah pengkodean tmptabel saya saja ? Atau haruskah saya mencoba mengubah pengkodean file?


ubah opsi encoding pada impor. Saya mengatur milik saya ke "Windows-1251" dan itu bekerja tanpa keluhan.
Brian D

1
Terima kasih @BrianD, saya juga menghadapi masalah ini dan ini berhasil untuk saya.
gouravkr

Jawaban:


110

Jika Anda perlu menyimpan data UTF8 di database Anda, Anda memerlukan database yang menerima UTF8. Anda dapat memeriksa encoding database Anda di pgAdmin. Cukup klik kanan database, dan pilih "Properties".

Tetapi kesalahan itu tampaknya memberi tahu Anda bahwa ada beberapa data UTF8 yang tidak valid di file sumber Anda. Artinya, copyutilitas tersebut telah mendeteksi atau menebak bahwa Anda memberinya file UTF8.

Jika Anda menjalankan beberapa varian Unix, Anda dapat memeriksa encoding (lebih atau kurang) dengan fileutilitas.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Saya pikir itu akan bekerja pada Mac di terminal, juga.) Tidak yakin bagaimana melakukannya di bawah Windows.

Jika Anda menggunakan utilitas yang sama pada file yang berasal dari sistem Windows (yaitu, file yang tidak dikodekan dalam UTF8), itu mungkin akan menampilkan sesuatu seperti ini:

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

Jika tetap aneh, Anda dapat mencoba mengubah data masukan Anda menjadi pengkodean yang dikenal, untuk mengubah pengkodean klien Anda, atau keduanya. (Kami benar-benar memperluas batas pengetahuan saya tentang pengkodean.)

Anda dapat menggunakan iconvutilitas untuk mengubah pengkodean data masukan.

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

Anda dapat mengubah encoding psql (klien) dengan mengikuti petunjuk di Dukungan Kumpulan Karakter . Di halaman tersebut, cari frasa "Untuk mengaktifkan konversi kumpulan karakter otomatis".


3
Mengatakan bahwa file tersebut adalah ASCII, tetapi berisi karakter beraksen, jadi itu pasti salah?
mpen

2
Akan menerima jawaban ini, tetapi saya pikir masalahnya sebenarnya dengan data (Q diperbarui).
mpen

1
Saya menemukan ini membantu, terima kasih. Omong-omong, ini berjalan di terminal OS X juga
Raul Rene

1
Ini berhasil untuk saya, tetapi dengan cara yang sedikit berbeda. Perintah "iconv" sebenarnya mengebom file saya, tetapi perintah itu tepat di tempat masalahnya - semacam karakter "-" yang aneh. Bagaimanapun, saya menghapus itu, dan file saya dapat dimuat ke postgres. Terima kasih atas tipnya!
trip0d199

1
Hanya untuk membantu orang lain dan mesin telusur: ini berfungsi untuk mengubah ekspor CSV Stripe dengan karakter yang tidak terbaca kembali ke UTF-8: `iconv -f ISO-8859-15 -t utf-8 customers.csv> customers-utf8.csv`
sscarduzio

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

Menambahkan encodingopsi berfungsi dalam kasus saya.


1
itu akan selesai tanpa kesalahan, itu mungkin atau mungkin tidak memberikan hasil yang bermanfaat. Anda perlu mengetahui pengkodean data yang dimaksudkan.
Jasen

1
Dalam skenario saya, bagaimana kueri di atas bekerja? Saya memiliki file csv yang dikodekan dengan UTF8 dan DB yang dikodekan dengan UTF8.
Ajay Takur

14

Rupanya saya hanya dapat menyetel pengkodean dengan cepat,

 set client_encoding to 'latin1'

Dan kemudian jalankan kembali kueri. Tidak yakin pengkodean apa yang harus saya gunakan.


latin1membuat karakter terbaca, tetapi sebagian besar karakter beraksen menggunakan huruf besar di tempat yang tidak semestinya. Saya berasumsi ini karena pengkodean yang buruk, tetapi saya pikir sebenarnya datanya yang buruk. Saya akhirnya menyimpan pengkodean latin1, tetapi melakukan pra-pemrosesan data dan memperbaiki masalah casing.


Menariknya, saya mendapat kesalahan pada pernyataan SELECT! Ini menyelesaikannya karena klien psql saya yang memberikan kesalahan, bukan database itu sendiri. (Yang akan menolak data di tempat pertama jika pengkodean melarangnya.)
Wildcard

14

Jika Anda baik-baik saja dengan membuang karakter yang tidak dapat dikonversi, Anda dapat menggunakan -cflag

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

lalu salin ke tabel Anda


Di Mac itu iconv -c -t UTF-8 filename.csv > filename.utf8.csvuntuk saya
Michael

8

Kesalahan ini berarti bahwa catatan pengkodean dalam file berbeda sehubungan dengan koneksi. Dalam kasus ini iconv mungkin mengembalikan kesalahan, kadang-kadang meskipun // mengabaikan tanda:

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

iconv: urutan input ilegal pada posisi (nomor tertentu)

Triknya adalah menemukan karakter yang salah dan menggantinya. Untuk melakukannya di Linux gunakan editor "vim":

vim (file teks Anda), tekan "ESC": tombol dan ketik ": goto (nomor dikembalikan oleh iconv)"

Untuk menemukan karakter non ASCII, Anda dapat menggunakan perintah berikut:

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

Jika Anda menghapus karakter yang salah, periksa apakah Anda benar-benar perlu mengonversi file Anda: mungkin masalahnya sudah terpecahkan.


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

5

ikuti langkah-langkah di bawah ini untuk menyelesaikan masalah ini di pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

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


4

Itu tergantung pada jenis mesin / pengkodean yang menghasilkan file impor Anda.

Jika Anda mendapatkannya dari Windows versi Inggris atau Eropa Barat, taruhan terbaik Anda mungkin mengaturnya ke 'WIN1252'. Jika Anda mendapatkannya dari sumber lain, lihat daftar pengkodean karakter di sini:

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

Jika Anda mendapatkannya dari Mac, Anda mungkin harus menjalankannya melalui utilitas "iconv" terlebih dahulu untuk mengubahnya dari MacRoman ke UTF-8.


4

Saya juga menghadapi masalah yang sama. Dan yang memecahkan masalah saya adalah ini:

Di excel klik Save as. Dari save as type, pilih .csv Klik Tools . Kemudian pilih opsi web dari daftar drop-down. Di bawah tab Encoding , simpan dokumen sebagai Unicode (UTF-8) . Klik OK. Simpan file. SELESAI!


3

Saya memiliki masalah yang sama, dan menemukan solusi yang bagus di sini: http://blog.e-shell.org/134

Hal ini disebabkan oleh ketidakcocokan dalam pengkodean database Anda, tentunya karena database tempat Anda mendapatkan dump SQL telah dikodekan sebagai SQL_ASCII sedangkan yang baru dikodekan sebagai UTF8. .. Recode adalah alat kecil dari proyek GNU yang memungkinkan Anda mengubah dengan cepat pengkodean file tertentu.

Jadi saya baru saja mengodekan ulang dumpfile sebelum memutarnya:

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

Dalam sistem Debian atau Ubuntu, kode ulang dapat diinstal melalui paket.


2

Anda dapat mengganti karakter garis miring terbalik dengan, misalnya karakter pipa, dengan sed.

sed -i -- 's/\\/|/g' filename.txt

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

Anda dapat mencoba ini untuk menangani encoding UTF8.


2

Contoh Singkat untuk Memecahkan Masalah ini di PHP-

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

Detail Kesalahan: Karena database POSTGRES tidak menangani selain Karakter UTF-8 ketika kami mencoba untuk meneruskan input yang diberikan di atas ke kolom, itu memberikan kesalahan "urutan byte tidak valid untuk pengkodean" UTF8 ": 0xab".

Jadi konversikan saja nilai itu menjadi UTF-8 sebelum dimasukkan ke dalam Database POSTGRES.


2

Saya memiliki masalah yang sama: file saya tidak dikodekan sebagai UTF-8. Saya telah menyelesaikannya dengan membuka file dengan notepad ++ dan mengubah pengkodean file.

Buka "Encoding" dan pilih "Convert to UTF-8". Simpan perubahan dan itu saja!


1

Kesalahan ini dapat terjadi jika data masukan mengandung karakter pelolosan itu sendiri. Secara default karakter escape adalah simbol "\", jadi jika teks input Anda berisi karakter "\" - coba ubah nilai default menggunakan opsi ESCAPE.


1

Untuk python, Anda perlu menggunakan

Kelas pg8000.types.Bytea (str) Bytea adalah kelas turunan str yang dipetakan ke array byte PostgreSQL.

atau

Pg8000.Binary (nilai) Membuat objek yang menyimpan data biner.


1

Saya mengalami masalah ini di bawah Windows saat bekerja secara eksklusif dengan psql (tanpa alat grafis). Untuk memperbaiki masalah ini, ubah encoding default psql (klien) secara permanen agar sesuai dengan encoding default server PostgreSQL. Jalankan perintah berikut di CMD atau Powershell:

setx PGCLIENTENCODING UTF8

Tutup dan buka kembali command prompt Anda / Powershell agar perubahan diterapkan.

Ubah penyandian file cadangan dari Unicode ke UTF8 dengan membukanya dengan Notepad dan masuk ke File -> Save As. Ubah menu tarik-turun Enkode dari Unicode ke UTF8. (Juga ubah Save as type from Text Documents (.txt) menjadi All Files untuk menghindari penambahan ekstensi .txt ke nama file cadangan Anda). Anda sekarang dapat memulihkan cadangan Anda.


0

Juga sangat mungkin dengan kesalahan ini bahwa bidang dienkripsi pada tempatnya. Pastikan Anda melihat tabel yang benar, dalam beberapa kasus administrator akan membuat tampilan tidak terenkripsi yang dapat Anda gunakan. Saya baru-baru ini mengalami masalah yang sangat mirip.


0

Saya mendapat kesalahan yang sama ketika saya mencoba menyalin csv yang dihasilkan oleh Excel ke tabel Postgres (semuanya di Mac). Beginilah cara saya menyelesaikannya:

1) Buka File di Atom (IDE yang saya gunakan)

2) Buat perubahan yang tidak signifikan pada file. Simpan file. Batalkan perubahan. Simpan lagi.

Presto! Salin perintah berfungsi sekarang.

(Saya pikir Atom menyimpannya dalam format yang berfungsi)


0

Buka file CSV dengan Notepad ++. Pilih menu Encoding\ Encoding in UTF-8, lalu perbaiki beberapa sel secara manual.

Kemudian coba impor lagi.


0

Jika CSV Anda akan diekspor dari SQL Server, ukurannya sangat besar, dan memiliki karakter Unicode, Anda dapat mengekspornya dengan menyetel pengkodean sebagai UTF-8:

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

Di halaman berikutnya ini menanyakan apakah Anda ingin menyalin data dari tabel atau Anda ingin menulis kueri. Jika Anda memiliki charatau varchartipe data di tabel Anda, pilih opsi kueri dan ubah kolom tersebut sebagai nvarchar(max). Misalnya jika myTablememiliki dua kolom di mana yang pertama varchardan yang kedua int, saya melemparkan yang pertama ke nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.