postgresql - postgres - secuencia de bytes no válida para codificación utf8 0xf3 0x6e 0x20 0x64
secuencia de bytes inválida para codificar "UTF8" (16)
Estoy tratando de importar algunos datos en mi base de datos. Así que 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 recibo el error,
ERROR: invalid byte sequence for encoding "UTF8": 0xc92c
¿Cómo arreglo eso? ¿Debo cambiar la codificación de toda mi base de datos (si es así, cómo?) O ¿puedo cambiar solo la codificación de mi tabla tmp
? ¿O debería intentar cambiar la codificación del archivo?
Abra el archivo CSV mediante Notepad ++. Elija el menú Encoding
/ Encoding in UTF-8
, luego arregle algunas celdas manualmente.
Luego intenta importar de nuevo.
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.
latin1
hizo que los personajes fueran legibles, pero la mayoría de los caracteres acentuados estaban en mayúsculas donde no deberían haber estado. Supuse que esto se debía a una mala codificación, pero creo que en realidad los datos fueron malos. Terminé manteniendo la codificación latin1, pero procesando previamente los datos y solucioné los problemas de la carcasa.
Bueno, yo estaba enfrentando el mismo problema. Y lo que resolvió mi problema es este:
En Excel, haga clic en Guardar como. Desde guardar como tipo, elija .csv Haga clic en Herramientas . A continuación, 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 !
Depende del tipo de máquina / codificación que generó su archivo de importación.
Si lo obtiene de una versión de Windows en inglés u occidental de Europa, su mejor opción probablemente sea configurarla en ''WIN1252''. Si lo está obteniendo 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 deba ejecutarlo a través de la utilidad "iconv" primero para convertirlo de MacRoman a UTF-8.
Este error puede ocurrir si los datos de entrada contienen el propio carácter de escape. Por defecto, el carácter de escape 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.
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 de // marcar 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 personajes incorrectos y reemplazarlos. Para hacerlo en Linux usa el editor "vim":
vim (su archivo de texto), presione "ESC": botón y escriba ": goto (número devuelto por iconv)"
Para encontrar caracteres que no sean 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.
Obtuve el mismo error cuando intentaba copiar una csv generada por Excel a una tabla de Postgres (todo en una Mac). Así es como lo resolví:
1) Abra el archivo en Atom (el IDE que uso)
2) Haga un cambio insignificante en el archivo. Guarda el archivo. Deshace el cambio. Guardar de nuevo
¡Presto! Copiar comando funcionó ahora.
(Creo que Atom lo guardó en un formato que funcionó)
Para Python, necesitas usar
Clase pg8000.types.Bytea (str) Bytea es una clase str-derived que se asigna a una matriz de bytes PostgreSQL.
o
Pg8000.Binary (valor) Construye un objeto que contiene datos binarios.
Puede reemplazar la barra invertida con, por ejemplo, un carácter de tubería, con sed.
sed -i -- ''s////|/g'' filename.txt
Si está de acuerdo con descartar caracteres no convertibles, puede usar -c
indicador
iconv -c -t utf8 filename.csv > filename.utf8.csv
y luego cópialos en tu mesa
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 con el botón derecho en la base de datos y seleccione "Propiedades".
Pero ese error parece estar diciéndote que hay algunos datos UTF8 no válidos en tu archivo fuente. Eso significa que la utilidad de copy
ha detectado o adivinado que está suministrando un archivo UTF8.
Si se está ejecutando bajo alguna variante de Unix, puede verificar la codificación (más o menos) con la utilidad de file
.
$ file yourfilename
yourfilename: UTF-8 Unicode English text
(Creo que 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 muestre algo como esto:
$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators
Si las cosas siguen siendo raras, puede tratar de convertir sus datos de entrada a una codificación conocida, cambiar la codificación de su cliente o ambas cosas. (Realmente estamos estirando los límites de mi conocimiento sobre codificaciones).
Puede usar la utilidad iconv
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 (del cliente) siguiendo las instrucciones del Soporte del juego de caracteres . En esa página, busque la frase "Para habilitar la conversión automática del juego de caracteres".
También es muy posible con este error que el campo esté encriptado en su lugar. Asegúrese de estar mirando la tabla correcta, en algunos casos los administradores crearán una vista no encriptada que puede usar en su lugar. Recientemente encontré un problema muy similar.
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 la base de datos, seguramente porque la base de datos desde donde obtuvo el volcado SQL estaba codificada como SQL_ASCII mientras que la nueva está codificada 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 de un paquete.
siga los pasos a continuación para resolver este problema en pgadmin:
SET client_encoding = ''ISO_8859_5'';
COPY tablename(column names) FROM ''D:/DB_BAK/csvfilename.csv'' WITH DELIMITER '','' CSV ;
copy tablename from ''filepath/filename'' DELIMITERS ''='' ENCODING ''WIN1252'';
puede intentar esto para manejar la codificación UTF8.
psql=# copy tmp from ''/path/to/file.csv'' with delimiter '','' csv header encoding ''windows-1251'';
Agregar la opción de encoding
funcionó en mi caso.