secuencia de bytes no válida para codificar "UTF8"

124

Estoy tratando de importar algunos datos en mi base de datos. Entonces he creado una tabla temporal,

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

Y ahora estoy tratando de importar los datos ,

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

Pero luego me sale el error,

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

¿Cómo arreglo eso? ¿Necesito cambiar la codificación de toda mi base de datos (si es así, ¿cómo?) O puedo cambiar solo la codificación de mi tmptabla? ¿O debería intentar cambiar la codificación del archivo?

mpen
fuente
cambiar la opción de codificación al importar. Puse el mío en "Windows-1251" y funcionó sin quejas.
Brian D
1
Gracias @BrianD, estaba enfrentando este problema también y esto funcionó para mí.
gouravkr

Respuestas:

109

Si necesita almacenar datos UTF8 en su base de datos, necesita una base de datos que acepte UTF8. Puede verificar la codificación de su base de datos en pgAdmin. Simplemente haga clic derecho en la base de datos y seleccione "Propiedades".

Pero ese error parece indicarle que hay algunos datos UTF8 no válidos en su archivo fuente. Eso significa que la copyutilidad ha detectado o adivinado que le está proporcionando un archivo UTF8.

Si está ejecutando alguna variante de Unix, puede verificar la codificación (más o menos) con la fileutilidad.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Creo que eso también funcionará en Mac en la terminal). No estoy seguro de cómo hacerlo en Windows.

Si usa esa misma utilidad en un archivo que proviene de sistemas Windows (es decir, un archivo que no está codificado en UTF8), probablemente mostrará algo como esto:

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

Si las cosas siguen siendo extrañas, puede intentar convertir sus datos de entrada a una codificación conocida, cambiar la codificación de su cliente, o ambos. (Realmente estamos ampliando los límites de mi conocimiento sobre codificaciones).

Puede usar la iconvutilidad para cambiar la codificación de los datos de entrada.

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

Puede cambiar la codificación psql (el cliente) siguiendo las instrucciones del Soporte de juego de caracteres . En esa página, busque la frase "Para habilitar la conversión automática de juegos de caracteres".

Mike Sherrill 'Retiro del gato'
fuente
3
Dice que el archivo es ASCII, pero contiene caracteres acentuados, ¿eso debe estar mal?
mpen 01 de
2
Aceptaré esta respuesta, pero creo que el problema fue en realidad con los datos (Q actualizada).
mpen
1
Esto me pareció útil, gracias. Por cierto, también se ejecuta en terminales OS X
Raul Rene el
1
Esto funcionó para mí, pero de una manera ligeramente diferente. El comando "iconv" realmente bombardeó mi archivo, pero funcionó justo donde estaba el problema: algún tipo extraño de carácter "-". De todos modos, eliminé eso, y mi archivo pudo cargarse en postgres. ¡Gracias por el consejo!
trip0d199
1
Solo para ayudar a otros y a los motores de búsqueda: esto funciona para convertir una exportación CSV de Stripe con caracteres ilegibles de nuevo a UTF-8: `iconv -f ISO-8859-15 -t utf-8 clients.csv> clients-utf8.csv`
sscarduzio
57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Agregar encodingopción funcionó en mi caso.

Nobu
fuente
1
se completará sin error, puede o no dar resultados útiles. necesita saber la codificación prevista de los datos.
Jasen
1
En mi escenario, ¿cómo funcionó la consulta anterior? Tengo un archivo csv codificado con UTF8 y DB codificado con UTF8.
Ajay Takur
14

Aparentemente puedo configurar la codificación sobre la marcha,

 set client_encoding to 'latin1'

Y luego vuelva a ejecutar la consulta. Sin embargo, no estoy seguro de qué codificación debería usar.


latin1hizo que los personajes fueran legibles, pero la mayoría de los personajes acentuados estaban en mayúsculas donde no deberían haber estado. Asumí que esto se debía a una mala codificación, pero creo que en realidad son los datos los que eran simplemente malos. Terminé manteniendo la codificación latin1, pero preprocesé los datos y solucioné los problemas de la carcasa.

mpen
fuente
Curiosamente, recibí el error en una instrucción SELECT. Esto lo resolvió porque era mi cliente psql el que daba el error, no la base de datos en sí. (Lo que habría rechazado los datos en primer lugar si la codificación lo hubiera prohibido).
Comodín el
14

Si está de acuerdo con descartar caracteres no convertibles, puede usar el -cindicador

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

y luego copiarlos a tu mesa

Abdellah Alaoui
fuente
En Mac fue iconv -c -t UTF-8 filename.csv > filename.utf8.csvpara mí
Michael
8

Este error significa que la codificación de registros en el archivo es diferente con respecto a la conexión. En este caso, iconv puede devolver el error, a veces incluso a pesar del indicador // IGNORE:

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

iconv: secuencia de entrada ilegal en la posición (algún número)

El truco es encontrar caracteres incorrectos y reemplazarlos. Para hacerlo en Linux use el editor "vim":

vim (su archivo de texto), presione "ESC": botón y escriba ": goto (número devuelto por iconv)"

Para buscar caracteres no ASCII, puede usar el siguiente comando:

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

Si elimina caracteres incorrectos, compruebe si realmente necesita convertir su archivo: probablemente el problema ya esté resuelto.

Yuri Levinsky
fuente
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
Jasen
5

Siga los pasos a continuación para resolver este problema en pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

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

Ramesh R
fuente
4

Depende de qué tipo de máquina / codificación generó su archivo de importación.

Si lo obtiene de una versión de Windows en inglés o en Europa occidental, su mejor opción es probablemente configurarlo en 'WIN1252'. Si lo obtiene de una fuente diferente, consulte la lista de codificaciones de caracteres aquí:

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

Si lo obtiene de una Mac, es posible que primero deba ejecutarlo a través de la utilidad "iconv" para convertirlo de MacRoman a UTF-8.

BobG
fuente
4

Bueno, estaba enfrentando el mismo problema. Y lo que resolvió mi problema es esto:

En Excel, haga clic en Guardar como. Desde guardar como tipo, elija .csv Haga clic en Herramientas . Luego elija las opciones web de la lista desplegable. En la pestaña Codificación , guarde el documento como Unicode (UTF-8) . Haga clic en Aceptar. Guarda el archivo. HECHO !

Vishal Chhatwani
fuente
3

Tuve el mismo problema y encontré una buena solución aquí: http://blog.e-shell.org/134

Esto se debe a una falta de coincidencia en las codificaciones de su base de datos, seguramente porque la base de datos de donde obtuvo el volcado de SQL se codificó como SQL_ASCII mientras que la nueva se codificó como UTF8. .. Recode es una pequeña herramienta del proyecto GNU que le permite cambiar sobre la marcha la codificación de un archivo determinado.

Así que acabo de recodificar el archivo de volcado antes de reproducirlo:

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

En los sistemas Debian o Ubuntu, recode se puede instalar a través del paquete.

Ed Doerr
fuente
2

Puede reemplazar el carácter de barra diagonal inversa con, por ejemplo, un carácter de tubería, con sed.

sed -i -- 's/\\/|/g' filename.txt
Richard Greenwood
fuente
2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

Puedes probar esto para manejar la codificación UTF8.

Rishi jha
fuente
2

Breve ejemplo para resolver este problema en PHP

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

Detalle del error: como la base de datos POSTGRES no maneja otros caracteres que no sean UTF-8 cuando intentamos pasar las entradas dadas arriba a una columna, da un error de "secuencia de bytes no válida para codificar" UTF8 ": 0xab".

Entonces, simplemente convierta ese valor en UTF-8 antes de insertarlo en la base de datos POSTGRES.

Nneha Sachan
fuente
2

Tuve el mismo problema: mi archivo no estaba codificado como UTF-8. Lo resolví abriendo el archivo con notepad ++ y cambiando la codificación del archivo.

Vaya a "Codificación" y seleccione "Convertir a UTF-8". ¡Guarde los cambios y eso es todo!

Francisco Javier Snchez Sabido
fuente
1

Este error puede ocurrir si los datos de entrada contienen el carácter de escape en sí. El carácter de escape predeterminado es el símbolo "\", por lo que si el texto de entrada contiene el carácter "\", intente cambiar el valor predeterminado con la opción ESCAPE.

jaasco
fuente
1

Para python, necesitas usar

La clase pg8000.types.Bytea (str) Bytea es una clase derivada de str que se asigna a una matriz de bytes PostgreSQL.

o

Pg8000.Binary (valor) Construye un objeto que contiene datos binarios.

vrn
fuente
1

Me encontré con este problema en Windows mientras trabajaba exclusivamente con psql (sin herramientas gráficas). Para solucionar este problema, cambie permanentemente la codificación predeterminada de psql (cliente) para que coincida con la codificación predeterminada del servidor PostgreSQL. Ejecute el siguiente comando en CMD o Powershell:

setx PGCLIENTENCODING UTF8

Cierre y vuelva a abrir el símbolo del sistema / Powershell para que el cambio surta efecto.

Cambie la codificación del archivo de copia de seguridad de Unicode a UTF8 abriéndolo con el Bloc de notas y vaya a Archivo -> Guardar como. Cambie el menú desplegable Codificación de Unicode a UTF8. (También cambie Guardar como tipo de Documentos de texto (.txt) a Todos los archivos para evitar agregar la extensión .txt al nombre de su archivo de respaldo). Ahora debería poder restaurar su copia de seguridad.

Jeje
fuente
0

También es muy posible con este error que el campo esté encriptado en su lugar. Asegúrese de mirar la tabla correcta, en algunos casos los administradores crearán una vista sin cifrar que puede usar en su lugar. Recientemente me encontré con un problema muy similar.

Josh Barton
fuente
0

Recibí el mismo error cuando intentaba copiar un csv generado por Excel en una tabla de Postgres (todo en una Mac). Así es como lo resolví:

1) Abra el archivo en Atom (el IDE que uso)

2) Realice un cambio insignificante en el archivo. Guarda el archivo. Deshacer el cambio. Guardar de nuevo.

¡Presto! El comando Copiar funcionó ahora.

(Creo que Atom lo guardó en un formato que funcionó)

Anupam
fuente
0

Abra el archivo CSV por Notepad ++. Elija menu Encoding\ Encoding in UTF-8, luego arregle algunas celdas manualmente.

Luego intente importar nuevamente.

Do Nhu Vy
fuente
0

Si su CSV se va a exportar desde SQL Server, es enorme y tiene caracteres Unicode, puede exportarlo configurando la codificación como UTF-8:

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

En la página siguiente, le pregunta si desea copiar datos de una tabla o si desea escribir una consulta. Si usted tiene charo varchartipos de datos en la tabla, seleccione la opción de consulta y emitir estas columnas nvarchar(max). Por ejemplo, si myTabletiene dos columnas donde está la primera varchary la segunda int, lanzo la primera para nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
LoMaPh
fuente