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 tmp
tabel saya saja ? Atau haruskah saya mencoba mengubah pengkodean file?
postgresql
import
mpen
sumber
sumber
Jawaban:
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,
copy
utilitas tersebut telah mendeteksi atau menebak bahwa Anda memberinya file UTF8.Jika Anda menjalankan beberapa varian Unix, Anda dapat memeriksa encoding (lebih atau kurang) dengan
file
utilitas.(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:
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
iconv
utilitas untuk mengubah pengkodean data masukan.Anda dapat mengubah encoding psql (klien) dengan mengikuti petunjuk di Dukungan Kumpulan Karakter . Di halaman tersebut, cari frasa "Untuk mengaktifkan konversi kumpulan karakter otomatis".
sumber
Menambahkan
encoding
opsi berfungsi dalam kasus saya.sumber
Rupanya saya hanya dapat menyetel pengkodean dengan cepat,
Dan kemudian jalankan kembali kueri. Tidak yakin pengkodean apa yang harus saya gunakan.
latin1
membuat 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.sumber
Jika Anda baik-baik saja dengan membuang karakter yang tidak dapat dikonversi, Anda dapat menggunakan
-c
flaglalu salin ke tabel Anda
sumber
iconv -c -t UTF-8 filename.csv > filename.utf8.csv
untuk sayaKesalahan 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.
sumber
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
ikuti langkah-langkah di bawah ini untuk menyelesaikan masalah ini di pgadmin:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
sumber
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.
sumber
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!
sumber
Saya memiliki masalah yang sama, dan menemukan solusi yang bagus di sini: http://blog.e-shell.org/134
Jadi saya baru saja mengodekan ulang dumpfile sebelum memutarnya:
Dalam sistem Debian atau Ubuntu, kode ulang dapat diinstal melalui paket.
sumber
Anda dapat mengganti karakter garis miring terbalik dengan, misalnya karakter pipa, dengan sed.
sumber
Anda dapat mencoba ini untuk menangani encoding UTF8.
sumber
Contoh Singkat untuk Memecahkan Masalah ini di PHP-
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.
sumber
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!
sumber
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.
sumber
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.
sumber
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:
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.
sumber
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.
sumber
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)
sumber
Buka file CSV dengan Notepad ++. Pilih menu
Encoding
\Encoding in UTF-8
, lalu perbaiki beberapa sel secara manual.Kemudian coba impor lagi.
sumber
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
char
atauvarchar
tipe data di tabel Anda, pilih opsi kueri dan ubah kolom tersebut sebagainvarchar(max)
. Misalnya jikamyTable
memiliki dua kolom di mana yang pertamavarchar
dan yang keduaint
, saya melemparkan yang pertama kenvarchar
:sumber