¿Cómo resolver los errores UTF8 validez Byte secuencia de copia de una restauración, cuando la base de datos fuente está codificado en UTF-8?

dba.stackexchange https://dba.stackexchange.com/questions/4777

  •  16-10-2019
  •  | 
  •  

Pregunta

Me dieron la tarea de migrar una base de datos PostgreSQL 8.2.x a otro servidor. Para ello estoy usando el pgAdmin 1.12.2 (en Ubuntu 11.04, por cierto) y el uso de la copia de seguridad y restauración mediante la costumbre / formato de compresión (.backup) y la codificación UTF-8.

La base de datos original está en UTF8, así:

-- Database: favela

-- DROP DATABASE favela;

CREATE DATABASE favela
  WITH OWNER = favela
       ENCODING = 'UTF8'
       TABLESPACE = favela
       CONNECTION LIMIT = -1;

Estoy creando esta base de datos exactamente como esta en el servidor de destino. Pero cuando yo restaure la base de datos del archivo .backup usando la opción de restauración que me da algunos de estos errores:

pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a709
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT:  COPY arena, line 62

Cuando compruebo que registran provocó este error, de hecho, algunos campos vartext tienen caracteres diacríticos como C (utilizado en portugués, por ejemplo, "Caça"), y cuando se quita manualmente desde el texto en los registros el error pasa a el siguiente registro que los tiene - ya que cuando copia tiene un error que detiene la inserción de datos en esta tabla. Y yo no quiero reemplazar manualmente uno a uno para lograr esto.

Sin embargo, es un poco extraño, ya que con UTF8 no debería haber este tipo de problemas, ¿verdad?

No sé cómo llegaron allí en el primer lugar. Sólo estoy migración de la base de datos, y que de alguna manera supose la base de datos era como en LATIN1 y luego fue cambiado inapropiadamente a UTF8.

¿Hay alguna manera de comprobar si una mesa / base de datos tiene secuencias UTF8 no válidos? O cualquier manera de hacer cumplir / reconvertir estos caracteres en UFT8 por lo que no surge algún problema cuando ejecuto la restauración?

Gracias, de antemano.

¿Fue útil?

Solución

de excavación alrededor de la Internet, he visto que esto es un problema bastante común. La solución común es utilizar el volcado de formato de texto plano y se alimentan a través de iconv para corregir la codificación.

Aquí es más información al respecto.

Otros consejos

"No sé cómo llegaron allí en el primer lugar"

Podría haber ocurrido tal como se describe aquí - aunque esto genera un error en 8.4:

Si crea una tabla con cualquier tipo de texto (es decir, texto, varchar (10), etc), entonces se puede insertar una secuencia de bytes no válido en ese campo usando octal escapes.

Por ejemplo, si usted tiene una base de datos UTF-8-codificado, que puede hacer:

=> CREATE foo TABLA (t TEXT);

=> INSERT INTO VALORES foo (E '\ 377');

Ahora, si copia la tabla a cabo, no se puede copiar el archivo resultante de vuelta . Eso significa que las copias de seguridad de pg_dump no serán capaces de restaurar. Lo único manera de obtener su espalda en los datos es volver a escapar de ese valor.

Hay un buen puesto en este el blog sobre las cuestiones generales y algunas maneras de tratar con ellos

Su probable que con la codificación predeterminada que utiliza el entorno Unix / Linux. Para comprobar qué codificación es actualmente el que viene por defecto, ejecute el siguiente:

$ echo $LANG
en_US

En este caso, podemos ver claramente que no es una codificación UTF-8, el que el comando de copia se basa en.

Así que para solucionar este problema, acabamos de fijar la variable LANG en el ejemplo a continuación:

$ export LANG=en_US.UTF-8

Nota: Esto sólo estará disponible para la sesión actual. Añadirlo a ~ / .bashrc o similar a tenerlo disponible en el inicio de cualquier sesión de shell futuro.

Referencia

No recomiendo ciegamente corriendo iconv en el volcado de texto sin formato, ya que puede convertir caracteres válidos (por ejemplo: caracteres chinos) con algunos otros personajes. Es mejor encontrar el carácter UTF8 no válida mediante la ejecución de comandos a continuación.

grep -naxv '.*' plain_text_dump.sql

y ejecute iconv en los datos particulares. Compruebe este documento para detallado paso a paso la explicación .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top