sequenza di byte non valida per la codifica "UTF8"


124

Sto cercando di importare alcuni dati nel mio database. Quindi ho creato una tabella temporanea,

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

E ora sto cercando di importare i dati ,

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

Ma poi ricevo l'errore,

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

Come lo risolvo? Devo modificare la codifica del mio intero database (in tal caso, come?) O posso cambiare solo la codifica della mia tmptabella? O dovrei tentare di modificare la codifica del file?


cambia l'opzione di codifica durante l'importazione. Ho impostato il mio su "Windows-1251" e ha funzionato senza lamentele.
Brian D,

1
Grazie @BrianD, anch'io stavo affrontando questo problema e questo ha funzionato per me.
gouravkr,

Risposte:


109

Se è necessario archiviare i dati UTF8 nel database, è necessario un database che accetta UTF8. Puoi controllare la codifica del tuo database in pgAdmin. Basta fare clic con il tasto destro del mouse sul database e selezionare "Proprietà".

Ma quell'errore sembra dirti che ci sono alcuni dati UTF8 non validi nel tuo file sorgente. Ciò significa che l' copyutilità ha rilevato o indovinato che stai fornendo un file UTF8.

Se stai utilizzando una variante di Unix, puoi controllare la codifica (più o meno) con l' fileutilità.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Penso che funzionerà anche su Mac nel terminale.) Non sono sicuro di come farlo in Windows.

Se usi la stessa utility su un file proveniente da sistemi Windows (ovvero un file non codificato in UTF8), probabilmente mostrerà qualcosa del genere:

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

Se le cose rimangono strane, potresti provare a convertire i dati di input in una codifica nota, a modificare la codifica del tuo client o entrambi. (Stiamo davvero allungando i limiti della mia conoscenza delle codifiche.)

È possibile utilizzare l' iconvutilità per modificare la codifica dei dati di input.

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

È possibile modificare la codifica psql (il client) seguendo le istruzioni sul supporto del set di caratteri . In quella pagina, cerca la frase "Per abilitare la conversione automatica del set di caratteri".


3
Dice che il file è ASCII, ma contiene caratteri accentati, quindi deve essere sbagliato?
Aprire l'

2
Accetterò questa risposta, ma penso che il problema riguardasse effettivamente i dati (Q aggiornata).
Aprire l'

1
L'ho trovato utile, grazie. A proposito, funziona anche su terminali OS X
Raul Rene il

1
Questo ha funzionato per me, ma in modo leggermente diverso. Il comando "iconv" in realtà ha bombardato il mio file, ma ha funzionato esattamente dove si trovava il problema - qualche strano tipo di carattere "-". Ad ogni modo, l'ho rimosso e il mio file è stato in grado di caricare in Postgres. Grazie per il consiglio!
trip0d199

1
Solo per aiutare gli altri e i motori di ricerca: questo funziona per convertire un'esportazione CSV Stripe con caratteri illeggibili in 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';

L'aggiunta encodingdell'opzione ha funzionato nel mio caso.


1
verrà completato senza errori, potrebbe o meno dare risultati utili. è necessario conoscere la codifica prevista dei dati.
Jasen,

1
Nel mio scenario come ha funzionato la query precedente? Ho un file CSV codificato con UTF8 e DB codificato con UTF8.
Ajay Takur,

14

Apparentemente posso semplicemente impostare la codifica al volo,

 set client_encoding to 'latin1'

E quindi rieseguire la query. Non sono sicuro di quale codifica dovrei usare però.


latin1rendeva leggibili i personaggi, ma la maggior parte dei personaggi accentati erano in lettere maiuscole dove non avrebbero dovuto essere. Ho pensato che ciò fosse dovuto a una cattiva codifica, ma penso che in realtà siano i dati che sono stati semplicemente cattivi. Ho finito per mantenere la codifica latin1, ma preelaborando i dati e risolto i problemi di involucro.


È interessante notare che ho ricevuto l'errore su un'istruzione SELECT! Questo è stato risolto perché era il mio client psql a dare l'errore, non il database stesso. (Che avrebbe rifiutato i dati in primo luogo se la codifica fosse vietata.)
Wildcard

14

Se stai bene scartando i personaggi non convertibili, puoi usare -cflag

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

e poi copiali sul tuo tavolo


Su Mac è stato iconv -c -t UTF-8 filename.csv > filename.utf8.csvper me
Michael,

8

Questo errore indica che la codifica dei record nel file è diversa rispetto alla connessione. In questo caso iconv potrebbe restituire l'errore, a volte anche nonostante il flag // IGNORE:

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

iconv: sequenza di input illegale in posizione (qualche numero)

Il trucco è trovare caratteri errati e sostituirli. Per farlo su Linux usa l'editor "vim":

vim (il tuo file di testo), premi "ESC": pulsante e digita ": goto (numero restituito da iconv)"

Per trovare caratteri non ASCII è possibile utilizzare il seguente comando:

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

Se rimuovi caratteri errati, verifica se hai davvero bisogno di convertire il tuo file: probabilmente il problema è già risolto.


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

5

seguire i passaggi seguenti per risolvere questo problema in pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

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


4

Dipende dal tipo di macchina / codifica che ha generato il file di importazione.

Se lo ricevi da una versione inglese o dell'Europa occidentale di Windows, la soluzione migliore è probabilmente impostarlo su "WIN1252". Se lo ricevi da una fonte diversa, consulta l'elenco delle codifiche dei caratteri qui:

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

Se lo ricevi da un Mac, potrebbe essere necessario eseguirlo prima tramite l'utilità "iconv" per convertirlo da MacRoman a UTF-8.


4

Beh, stavo affrontando lo stesso problema. E ciò che ha risolto il mio problema è questo:

In Excel fai clic su Salva con nome. Da Salva come tipo, scegli .csv Fai clic su Strumenti . Quindi selezionare le opzioni Web dall'elenco a discesa. Nella scheda Codifica , salva il documento come Unicode (UTF-8) . Clicca OK. Salva il file. FATTO !


3

Ho avuto lo stesso problema e ho trovato una buona soluzione qui: http://blog.e-shell.org/134

Ciò è causato da una mancata corrispondenza nelle codifiche del database, sicuramente perché il database da cui è stato ottenuto il dump SQL è stato codificato come SQL_ASCII mentre quello nuovo è codificato come UTF8. .. Recode è un piccolo strumento del progetto GNU che ti consente di modificare al volo la codifica di un determinato file.

Quindi ho appena ricodificato il dumpfile prima di riprodurlo:

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

Nei sistemi Debian o Ubuntu, la ricodifica può essere installata tramite pacchetto.


2

È possibile sostituire il carattere barra rovesciata con, ad esempio un carattere pipe, con sed.

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

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

puoi provare questo per gestire la codifica UTF8.


2

Breve esempio per risolvere questo problema in PHP-

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

Dettaglio errore: poiché il database POSTGRES non gestisce altri caratteri UTF-8 quando proviamo a passare sopra gli input dati a una colonna, viene visualizzato l'errore "sequenza byte non valida per la codifica" UTF8 ": 0xab".

Quindi basta convertire quel valore in UTF-8 prima dell'inserimento nel database POSTGRES.


2

Ho avuto lo stesso problema: il mio file non era codificato come UTF-8. L'ho risolto aprendo il file con notepad ++ e modificando la codifica del file.

Vai su "Codifica" e seleziona "Converti in UTF-8". Salva le modifiche e tutto qui!


1

Questo errore può verificarsi se i dati di input contengono il carattere di escape stesso. Per impostazione predefinita, il carattere di escape è il simbolo "\", quindi se il testo di input contiene il carattere "\", prova a modificare il valore predefinito utilizzando l'opzione ESCAPE.


1

Per Python, devi usare

Classe pg8000.types.Bytea (str) Bytea è una classe derivata da str che è mappata su un array di byte PostgreSQL.

o

Pg8000.Binary (valore) Costruisce un oggetto che contiene dati binari.


1

Ho riscontrato questo problema con Windows mentre lavoravo esclusivamente con psql (senza strumenti grafici). Per risolvere questo problema, modificare in modo permanente la codifica predefinita di psql (client) in modo che corrisponda alla codifica predefinita del server PostgreSQL. Eseguire il comando seguente in CMD o Powershell:

setx PGCLIENTENCODING UTF8

Chiudi e riapri il prompt dei comandi / Powershell per rendere effettiva la modifica.

Cambia la codifica del file di backup da Unicode a UTF8 aprendolo con Blocco note e andando su File -> Salva con nome. Modifica il menu a discesa Codifica da Unicode a UTF8. (Modificare anche il tipo Salva da Documenti di testo (.txt) in Tutti i file per evitare di aggiungere l'estensione .txt al nome del file di backup). Ora dovresti essere in grado di ripristinare il backup.


0

È anche molto possibile con questo errore che il campo sia crittografato sul posto. Assicurati di guardare la tabella giusta, in alcuni casi gli amministratori creeranno una vista non crittografata che puoi utilizzare invece. Di recente ho riscontrato un problema molto simile.


0

Ho avuto lo stesso errore quando stavo cercando di copiare un csv generato da Excel in una tabella Postgres (tutto su un Mac). Ecco come l'ho risolto:

1) Apri il File in Atom (l'IDE che utilizzo)

2) Apporta una modifica insignificante al file. Salva il file. Annulla la modifica. Salva di nuovo

Presto! Il comando Copia ora funziona.

(Penso che Atom lo abbia salvato in un formato che ha funzionato)


0

Apri il file CSV con Notepad ++. Scegli menu Encoding\ Encoding in UTF-8, quindi correggi manualmente alcune celle.

Quindi riprovare a importare.


0

Se il tuo CSV verrà esportato da SQL Server, è enorme e ha caratteri Unicode, puoi esportarlo impostando la codifica come UTF-8:

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

Nella pagina successiva viene chiesto se si desidera copiare dati da una tabella o si desidera scrivere una query. Se nella tabella sono presenti tipi di dati charo varchar, selezionare l'opzione di query e eseguire il cast di tali colonne come nvarchar(max). Ad esempio, se myTableha due colonne in cui si trova la prima varchare la seconda int, lancio la prima per nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.