2011-02-01 78 views
86

Estoy trying to import some data en mi base de datos. Así que he creado una tabla temporal,secuencia de bytes no válida para codificar "UTF8"

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 the data,

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

Pero entonces me sale el error,

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

¿Cómo ¿Arregla 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?

+0

cambio de la opción de codificación en la importación. Puse el mío en "Windows-1251" y funcionó sin quejas. –

Respuesta

80

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 copy ha detectado o adivinado que está suministrando un archivo UTF8.

Si está ejecutando bajo alguna variante de Unix, puede verificar la codificación (más o menos) con la utilidad 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 utiliza la misma utilidad en un archivo que venía de los sistemas Windows (es decir, un archivo que es no codificado en UTF-8), es probable que mostrar algo como esto:

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

Si las cosas Quédate raro, podrías tratar de convertir tus datos de entrada a una codificación conocida, cambiar la codificación de tu cliente o ambas cosas. (Realmente estamos ampliando los límites de mi conocimiento acerca de las 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 psql (el cliente) que codifica siguiendo las instrucciones en Character Set Support. En esa página, busque la frase "Para habilitar la conversión automática del juego de caracteres".

+2

Dice que el archivo es ASCII, pero contiene caracteres acentuados, por lo que debe estar equivocado. – mpen

+0

@Mark: Bueno, o bien la copia de PostgreSQL está adivinando mal, o la utilidad de los archivos está adivinando. Para un archivo de Windows que tiene acentos, 'file' me dice" texto ISO-8859, con terminadores de línea CRLF ". Los documentos para 'copiar' decir '' Los datos de entrada se interpretan de acuerdo con la codificación del cliente actual,.incluso si los datos no pasan por el cliente, sino que el servidor los lee o los escribe directamente en un archivo. "Hmmm. Creo que sé cómo cambiar eso. –

+0

No estoy seguro de si su mejor opción es intentar convierta los datos a una codificación conocida, para cambiar la codificación del cliente durante la importación, o ambos. Editaré mi respuesta. –

4

Depende del tipo de máquina/codificación que generó su archivo de importación.

Si lo obtiene de una versión en inglés u occidental de Windows, su mejor opción probablemente sea configurarla en 'WIN1252'. Si lo está recibiendo de una fuente diferente, consulte la lista de codificaciones de caracteres aquí:

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

Si usted está recibiendo desde un Mac, puede que tenga que ejecutar a través de la utilidad "iconv" primera para convertirlo de MacRoman a UTF-8.

5

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 // indicador ignorar:

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

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

El truco está en encontrar los caracteres incorrectos y reemplazarlos. Para hacerlo en Linux utilizar "vim" Editor:

vim (archivo de texto), pulse la tecla "ESC": botón y tipo ": Goto (número devuelto por iconv)"

a encontrar caracteres ASCII no le puede utilizar el siguiente comando:

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

Si quita caracteres incorrectos compruebe si realmente se necesita para convertir su archivo : probablemente el problema ya está resuelto

+0

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

34
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251'; 

Añadiendo encoding opción trabajado en mi caso.

+0

se completará sin error, puede o no dar resultados útiles. necesita saber la codificación deseada de los datos. – Jasen

+0

En mi escenario, ¿cómo funcionó la consulta anterior? Tengo un archivo csv codificado con UTF8 y DB codificado con UTF8. –

0

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.

1

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

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

Al parecer sólo puedo set the encoding sobre la marcha,

set client_encoding to 'latin1' 

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


latin1 hicieron los caracteres legibles, pero la mayoría de los caracteres acentuados estaban en mayúsculas donde no deberían haber sido. 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.

+0

¡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 tenía la codificación prohibida). – Wildcard

0

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.

3

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

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

2

siga los pasos siguientes 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

que tenían el mismo problema, y ​​se 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 recibió el volcado de 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 sólo 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, recodificar puede instalarse por paquete.

0

Recibí el mismo error cuando estaba tratando de copiar una csv generada por Excel en una tabla Postgres (todo en una Mac). Se trata de cómo lo resolví:

1) Abrir el archivo en Atom (el IDE que utilizo)

2) Hacer un cambio insignificante en el archivo. Guarda el archivo. Deshace el cambio. Guardar de nuevo

Presto! Copiar comando funcionó ahora.

(creo Atom guarda en un formato que funcionó)

0

para Python, es necesario utilizar

Clase pg8000.types.Bytea (str) bytea es una clase str-derivada que es mapeado a una matriz de bytes PostgreSQL.

o

Pg8000.Binary (valor) construir un objeto el almacenamiento de datos binarios.

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

puede intentarlo para manejar la codificación UTF8.

1

Si estás bien con descartando personajes no convertibles, puede utilizar -c bandera

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

y luego copiarlos en su mesa

Cuestiones relacionadas