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 tmp
tabla? ¿O debería intentar cambiar la codificación del archivo?
postgresql
import
mpen
fuente
fuente
Respuestas:
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
copy
utilidad 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
file
utilidad.(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:
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
iconv
utilidad para cambiar la codificación de los datos de entrada.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".
fuente
Agregar
encoding
opción funcionó en mi caso.fuente
Aparentemente puedo configurar la codificación sobre la marcha,
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 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.fuente
Si está de acuerdo con descartar caracteres no convertibles, puede usar el
-c
indicadory luego copiarlos a tu mesa
fuente
iconv -c -t UTF-8 filename.csv > filename.utf8.csv
para mí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.
fuente
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
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 ;
fuente
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.
fuente
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 !
fuente
Tuve el mismo problema y encontré una buena solución aquí: http://blog.e-shell.org/134
Así que acabo de recodificar el archivo de volcado antes de reproducirlo:
En los sistemas Debian o Ubuntu, recode se puede instalar a través del paquete.
fuente
Puede reemplazar el carácter de barra diagonal inversa con, por ejemplo, un carácter de tubería, con sed.
fuente
Puedes probar esto para manejar la codificación UTF8.
fuente
Breve ejemplo para resolver este problema en PHP
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.
fuente
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!
fuente
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.
fuente
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.
fuente
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:
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.
fuente
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.
fuente
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ó)
fuente
Abra el archivo CSV por Notepad ++. Elija menu
Encoding
\Encoding in UTF-8
, luego arregle algunas celdas manualmente.Luego intente importar nuevamente.
fuente
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
char
ovarchar
tipos de datos en la tabla, seleccione la opción de consulta y emitir estas columnasnvarchar(max)
. Por ejemplo, simyTable
tiene dos columnas donde está la primeravarchar
y la segundaint
, lanzo la primera paranvarchar
:fuente