secuencia de bytes no válida para la codificación " UTF8"


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 entonces obtengo el error,

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

¿Cómo lo arreglo? ¿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 tabla tmp? ¿O debería intentar cambiar la codificación del archivo?

Author: Community, 2011-02-01

16 answers

Si necesita almacenar datos UTF8 en su base de datos, necesita una base de datos que acepte UTF8. Puede comprobar 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 estar diciéndole que hay algunos datos UTF8 no válidos en su archivo de origen. Eso significa que la utilidad copy ha detectado o adivinado que está alimentando un archivo UTF8.

Si se está ejecutando bajo alguna variante de Unix, puede comprobar la codificación (más o menos) con el file utilidad.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Creo que funcionará en Macs en el terminal, también.) No estoy seguro de cómo hacer eso bajo Windows.

Si usa la misma utilidad en un archivo que proviene de sistemas Windows (es decir, un archivo que está no 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, para cambiar la codificación de su cliente, o ambos. (Estamos realmente estirando los límites de mi conocimiento sobre codificaciones.)

Puede utilizar el iconv utilidad 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 de Character Set Support. En esa página, busque la frase "Para habilitar la conversión automática de conjuntos de caracteres".

 89
Author: Mike Sherrill 'Cat Recall',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 20:03:57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Agregar la opción encoding funcionó en mi caso.

 40
Author: Nobu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 21:23:08

Aparentemente puedo simplemente establecer 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 los caracteres legibles, pero la mayoría de los caracteres 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 que simplemente eran malos. Terminé manteniendo la codificación latin1, pero preprocesando los datos y arreglando los problemas de la carcasa.

 9
Author: mpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-23 20:44:54

Este error significa que la codificación de los 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 //IGNORE flag:

Iconv-f ASCII-t utf-8 / / IGNORAR /a.txt

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

El truco es encontrar caracteres incorrectos y reemplazarlo. 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 encontrar caracteres no ASCII puede usar el siguiente comando:

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

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

 6
Author: Yuri Levinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-11 09:07:13

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

Si lo está obteniendo de una versión en inglés o en Europa occidental de Windows, su mejor apuesta es probablemente configurarlo 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 un Mac, es posible que tenga que ejecutarlo a través de la utilidad "iconv" primero para convertirlo de MacRoman a UTF-8.

 4
Author: BobG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 20:08:34

Bueno, me enfrentaba al mismo problema. Y lo que resolvió mi problema es este:

En excel haga clic en Guardar como. En guardar como tipo, elija .csv Haga clic en Herramientas . A continuación, elija opciones web de la lista desplegable. En la pestaña Encoding, guarde el documento como Unicode(UTF-8). Haga clic en Aceptar. Guarde el archivo. ¡HECHO !

 4
Author: Vishal Chhatwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 20:43:48

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

sed -i -- 's/\\/|/g' filename.txt
 2
Author: Richard Greenwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-14 22:23:11

Siga los siguientes pasos 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 ;

 2
Author: Ramesh R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 17:33:40

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

Esto es causado por un desajuste en las codificaciones de su base de datos, seguramente porque la base de datos de 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 dado.

Así que acabo de recodificar el archivo de descarga antes de reproducirlo volver:

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

En sistemas Debian o Ubuntu, recode puede ser instalado vía paquete.

 2
Author: Ed Doerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 04:34:32

Si está de acuerdo con descartar caracteres no convertibles, puede usar -c flag

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

Y luego copiarlos a su tabla

 2
Author: Abdellah Alaoui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 12:03:47

Para python, debe usar

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

O

Pg8000.Binario (valor) Construir un objeto conteniendo datos binarios.

 1
Author: vrn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-18 11:09:46
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

Puede probar esto para manejar la codificación UTF8.

 1
Author: Rishi jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-04 07:00:38

Este error puede ocurrir si los datos de entrada contienen el propio carácter de escape. De forma predeterminada, 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 utilizando la opción de ESCAPE.

 0
Author: jaasco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 11:08:11

También es muy posible con este error que el campo esté cifrado en su lugar. Asegúrese de que está mirando 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.

 0
Author: Josh Barton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-08 20:38:40

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

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

2) Hacer un cambio insignificante en el archivo. Guarde el archivo. Deshacer el cambio. Ahorra otra vez.

Presto! El comando Copiar funcionó ahora.

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

 0
Author: Anupam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-27 07:10:34

Abrir archivo CSV por Notepad++ . Elegir menú Encoding \ Encoding in UTF-8, a continuación, fijar algunas células manuallly.

A continuación, intente importar de nuevo.

 0
Author: Do Nhu Vy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 03:19:16