"UTF8" kodlaması için geçersiz bayt dizisi


125

Ben Veritabanıma bazı verileri çalışıyorum . Bu yüzden geçici bir tablo oluşturdum

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

Ve şimdi ithal etmeye çalışıyorum verileri ,

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

Ama sonra hatayı alıyorum

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

Bunu nasıl düzeltirim? Veritabanımın tamamının kodlamasını değiştirmem gerekir mi (öyleyse, nasıl?) Yoksa sadece tablomun kodlamasını değiştirebilir miyim tmp? Yoksa dosyanın kodlamasını değiştirmeyi denemeli miyim?


içe aktarmada kodlama seçeneğini değiştirin. Benimkini "Windows-1251" olarak ayarladım ve şikayet etmeden çalıştı.
Brian D

1
Teşekkürler @ BrianD, ben de bu sorunla karşı karşıyaydım ve bu benim için çalıştı.
gouravkr

Yanıtlar:


110

Veritabanınızda UTF8 verilerini depolamanız gerekiyorsa, UTF8'i kabul eden bir veritabanına ihtiyacınız vardır. Veritabanınızın kodlamasını pgAdmin'de kontrol edebilirsiniz. Veritabanına sağ tıklayın ve "Özellikler" i seçin.

Ancak bu hata, kaynak dosyanızda bazı geçersiz UTF8 verileri olduğunu söylüyor gibi görünüyor. Bu şu demektircopy yardımcı programın onu bir UTF8 dosyasıyla beslediğinizi algıladığı veya tahmin ettiği .

Unix'in bir varyantı altında çalışıyorsanız, kodlamayı (aşağı yukarı) fileyardımcı programla kontrol edebilirsiniz.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Bunun terminaldeki Mac'lerde de çalışacağını düşünüyorum.) Bunu Windows altında nasıl yapacağımı bilmiyorum.

Eğer (olduğunu, oluyor bir dosya, Windows sistemlerinden gelen bir dosya üzerinde aynı programı kullanırsanız değil UTF8 olarak kodlanmış), muhtemelen böyle bir şey gösterecektir:

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

İşler tuhaf kalırsa, giriş verilerinizi bilinen bir kodlamaya dönüştürmeyi, istemcinizin kodlamasını değiştirmeyi veya her ikisini de deneyebilirsiniz. (Kodlamalar hakkındaki bilgimin sınırlarını gerçekten genişletiyoruz.)

iconvYardımcı programı, giriş verilerinin kodlamasını değiştirmek için kullanabilirsiniz .

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

Karakter Seti Desteği'ndeki talimatları izleyerek psql (istemci) kodlamasını değiştirebilirsiniz . Bu sayfada, "Otomatik karakter seti dönüştürmeyi etkinleştirmek için" ifadesini arayın.


3
Dosyanın ASCII olduğunu söylüyor, ancak aksanlı karakterler içeriyor, bu yüzden bu yanlış olmalı?
mpen

2
Bu yanıtı kabul edecek, ancak sorunun aslında verilerle ilgili olduğunu düşünüyorum (güncellenmiş Q).
mpen

1
Bunu yararlı buldum, teşekkürler. Bu arada, OS X terminallerinde de çalışıyor
Raul Rene

1
Bu benim için çalıştı, ancak biraz farklı bir şekilde. "İconv" komutu aslında dosyama bomba attı, ancak sorunun olduğu yerde tam olarak yaptı - bir tür garip "-" karakter. Her neyse, onu kaldırdım ve dosyam postgres'e yüklenebildi. Bahşiş için teşekkürler!
trip0d199

1
Sadece başkalarına ve arama motorlarına yardım etmek için: bu, okunamayan karakterlere sahip Stripe CSV dışa aktarımını UTF-8'e dönüştürmek için çalışır: `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';

encodingBenim durumumda seçenek eklemek işe yaradı.


1
hatasız tamamlanır, yararlı sonuçlar verebilir veya vermeyebilir. verilerin amaçlanan kodlamasını bilmeniz gerekir.
Jasen

1
Benim senaryomda yukarıdaki sorgu nasıl çalıştı? UTF8 ve UTF8 ile kodlanmış DB ile kodlanmış csv dosyam var.
Ajay Takur

14

Görünüşe göre kodlamayı anında ayarlayabilirim.

 set client_encoding to 'latin1'

Ve sonra sorguyu yeniden çalıştırın. Yine de hangi kodlamayı kullanmam gerektiğinden emin değilim.


latin1karakterleri okunaklı hale getirdi, ancak aksanlı karakterlerin çoğu olmaması gereken yerde büyük harfle yazılmıştır. Bunun kötü bir kodlamadan kaynaklandığını varsaydım, ama bence aslında kötü olan verilerdi. Latin1 kodlamasını tutmayı bıraktım, ancak verileri önceden işledim ve büyük / küçük harf sorunlarını düzelttim.


İlginç bir şekilde, bir SELECT ifadesindeki hatayı aldım! Bu sorunu çözdü çünkü hatayı veren benim psql istemcimdi , veritabanının kendisi değil. (Kodlama onu yasaklamış olsaydı, ilk başta verileri reddederdi.)
Wildcard,

14

Dönüştürülemeyen karakterleri atmakta sorun yoksa, -cbayrak kullanabilirsiniz.

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

ve sonra onları masanıza kopyalayın


Mac'te oldu iconv -c -t UTF-8 filename.csv > filename.utf8.csvbenim için
Michael

8

Bu hata, dosyadaki kodlama kayıtlarının bağlantıya göre farklı olduğu anlamına gelir. Bu durumda iconv bazen // IGNORE bayrağına rağmen hatayı döndürebilir:

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

iconv: pozisyonda geçersiz girdi dizisi (bir sayı)

İşin püf noktası, yanlış karakterleri bulmak ve değiştirmektir. Bunu Linux'ta yapmak için "vim" editörünü kullanın:

vim (metin dosyanız), "ESC": düğmesine basın ve ": goto (iconv tarafından döndürülen sayı)" yazın

ASCII olmayan karakterleri bulmak için aşağıdaki komutu kullanabilirsiniz:

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

Yanlış karakterleri kaldırırsanız, lütfen dosyanızı gerçekten dönüştürmeniz gerekip gerekmediğini kontrol edin: muhtemelen sorun zaten çözülmüştür.


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

5

Bu sorunu pgadmin'de çözmek için aşağıdaki adımları izleyin:

  1. SET client_encoding = 'ISO_8859_5';

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


4

İçe aktarma dosyanızı hangi tür makine / kodlamanın oluşturduğuna bağlıdır.

Windows'un İngilizce veya Batı Avrupa sürümünden alıyorsanız, en iyi seçeneğiniz muhtemelen onu 'WIN1252' olarak ayarlamaktır. Farklı bir kaynaktan alıyorsanız, buradaki karakter kodlamaları listesine bakın:

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

Bir Mac'ten alıyorsanız, onu MacRoman'dan UTF-8'e dönüştürmek için önce "iconv" yardımcı programıyla çalıştırmanız gerekebilir.


4

Ben de aynı sorunla karşı karşıyaydım. Ve sorunumu çözen şey şuydu:

Excel'de Farklı Kaydet'e tıklayın. Kayıt türü'nden .csv'yi seçin Araçlar'a tıklayın . Ardından açılır listeden web seçeneklerini seçin. Kodlama sekmesi altında , belgeyi Unicode (UTF-8) olarak kaydedin . Tamam'ı tıklayın. Dosya 'yı kaydet. YAPILDI!


3

Aynı sorunu yaşadım ve burada güzel bir çözüm buldum: http://blog.e-shell.org/134

Bunun nedeni, veritabanı kodlamalarınızdaki bir uyumsuzluktan kaynaklanmaktadır, çünkü kesinlikle SQL dökümünü aldığınız veritabanı, yeni olan UTF8 olarak kodlanırken SQL_ASCII olarak kodlanmıştır. .. Recode, belirli bir dosyanın kodlamasını anında değiştirmenize izin veren GNU projesinden küçük bir araçtır.

Bu yüzden, geri oynatmadan önce döküm dosyasını yeniden kodladım:

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

Debian veya Ubuntu sistemlerinde, recode paket üzerinden kurulabilir.


2

Ters eğik çizgi karakterini, örneğin bir dikey çizgi karakteriyle, sed ile değiştirebilirsiniz.

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

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

UTF8 kodlamasını işlemek için bunu deneyebilirsiniz.


2

PHP'de Bu Sorunu Çözmek İçin Kısa Örnek-

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

Hata Ayrıntısı: POSTGRES veri tabanı UTF-8 Karakterleri dışında başka bir işleme sahip olmadığından, yukarıda verilen girdileri bir sütuna geçirmeye çalıştığımızda "UTF8" kodlaması için geçersiz bayt dizisi hatası veriyor: 0xab ".

POSTGRES Veritabanına eklemeden önce bu değeri UTF-8'e dönüştürün.


2

Aynı sorunu yaşadım: dosyam UTF-8 olarak kodlanmamış. Dosyayı notepad ++ ile açıp dosyanın kodlamasını değiştirerek çözdüm.

"Kodlama" ya gidin ve "UTF-8'e Dönüştür" ü seçin. Değişiklikleri kaydedin, hepsi bu!


1

Bu hata, giriş verilerinin kendisi çıkış karakteri içeriyorsa ortaya çıkabilir. Varsayılan olarak kaçış karakteri "\" simgesidir, bu nedenle giriş metniniz "\" karakterini içeriyorsa - ESCAPE seçeneğini kullanarak varsayılan değeri değiştirmeyi deneyin.


1

Python için şunu kullanmanız gerekir:

Sınıf pg8000.types.Bytea (str) Bytea, bir PostgreSQL bayt dizisine eşlenen, str türevi bir sınıftır.

veya

Pg8000.Binary (değer) İkili verileri tutan bir nesne oluşturun.


1

Windows altında sadece psql ile çalışırken bu problemle karşılaştım (grafik araçları yok). Bu sorunu çözmek için, varsayılan psql (istemci) kodlamasını kalıcı olarak PostgreSQL sunucusunun varsayılan kodlamasıyla eşleşecek şekilde değiştirin. CMD veya Powershell'de aşağıdaki komutu çalıştırın:

setx PGCLIENTENCODING UTF8

Değişikliğin etkili olması için komut istemini / Powershell'i kapatıp yeniden açın.

Yedekleme dosyasının kodlamasını Not Defteri ile açıp Dosya -> Farklı Kaydet'e giderek Unicode'dan UTF8'e değiştirin. Kodlama açılır menüsünü Unicode'dan UTF8'e değiştirin. (Yedek dosyanızın adına .txt uzantısını eklemekten kaçınmak için Metin Belgeleri'nden (.txt) Farklı Kaydetme türünü Tüm Dosyalar'a değiştirin). Artık yedeğinizi geri yükleyebilmelisiniz.


0

Bu hata ile alanın yerinde şifrelenmesi de çok mümkündür. Doğru tabloya baktığınızdan emin olun, bazı durumlarda yöneticiler bunun yerine kullanabileceğiniz şifrelenmemiş bir görünüm oluşturur. Geçenlerde çok benzer bir sorunla karşılaştım.


0

Excel tarafından oluşturulan bir csv'yi bir Postgres tablosuna (tümü bir Mac'te) kopyalamaya çalışırken aynı hatayı aldım. Ben böyle çözdüm:

1) Atom’daki Dosyayı (kullandığım IDE) açın

2) Dosyada önemsiz bir değişiklik yapın. Dosya 'yı kaydet. Değişikliği geri alın. Tekrar kaydedin.

Presto! Kopyala komutu şimdi çalıştı.

(Sanırım Atom onu ​​işe yarayan bir formatta kaydetti)


0

CSV dosyasını Notepad ++ ile açın. Menü Encoding\ seçin Encoding in UTF-8, ardından birkaç hücreyi manuel olarak düzeltin.

Ardından tekrar içe aktarmayı deneyin.


0

CSV'niz SQL Server'dan dışa aktarılacaksa, çok büyükse ve Unicode karakterlere sahipse, kodlamayı şu şekilde ayarlayarak dışa aktarabilirsiniz UTF-8:

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

Bir sonraki sayfada, bir tablodan veri kopyalamak isteyip istemediğinizi veya bir sorgu yazmak isteyip istemediğinizi sorar. Tablonuzda charveya varcharveri türleri varsa , sorgu seçeneğini seçin ve bu sütunları olarak atayın nvarchar(max). Örneğin eğer myTableilki olduğu iki sütun bulunur varcharve ikincisi int, ben ilk kişinin dökme nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.