Foi-me dada a tarefa de migrar um banco de dados PostgreSQL 8.2.x para outro servidor. Para fazer isso, estou usando o pgAdmin 1.12.2 (a propósito, no Ubuntu 11.04) e usando o Backup and Restore usando o formato custom / compress (.backup) e a codificação UTF8.
O banco de dados original está em UTF8, assim:
-- Database: favela
-- DROP DATABASE favela;
CREATE DATABASE favela
WITH OWNER = favela
ENCODING = 'UTF8'
TABLESPACE = favela
CONNECTION LIMIT = -1;
Estou criando esse banco de dados exatamente assim no servidor de destino. Mas quando eu restauro o banco de dados a partir do arquivo .backup usando a opção Restaurar, ele apresenta alguns desses erros:
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
Quando eu checo qual registro acionou esse erro, alguns campos de texto de texto possuem caracteres diacríticos como ç (usado em português, por exemplo, "caça"), e quando eu os removo manualmente do texto nos registros, o erro passa para o próximo registro que os possui - pois quando a cópia apresenta um erro, ela para de inserir dados nesta tabela. E não quero substituí-los manualmente, um por um, para fazer isso.
Mas é meio estranho, porque com o UTF8 não deveria haver esse tipo de problema, certo?
Eu não sei como eles chegaram lá em primeiro lugar. Estou apenas migrando o banco de dados e suponho que, de alguma forma, o banco de dados estivesse no LATIN1 e, em seguida, foi incorretamente alterado para UTF8.
Existe alguma maneira de verificar se uma tabela / banco de dados possui sequências UTF8 inválidas? Ou alguma maneira de impor / reconverter esses caracteres no UFT8, para não ter problemas ao executar a restauração?
Desde já, obrigado.