Uma solução típica é usar iconv -c
.
Estou trabalhando para mover vários bancos de dados de um servidor Postgresql 8.3 para um servidor Postgresql 8.4. Ele funcionou bem até agora, mas uma base me deu alguns problemas. O banco de dados está listado como codificado em unicode no servidor 8.3, mas de alguma forma um programa cliente conseguiu injetar alguns dados unicode inválidos nele.
Quando faço um despejo normal e restauro usando o formato personalizado do postgres, o novo servidor não o aceita, reclamando de erros de unicode.
Meu plano é fazer um despejo de texto simples do banco de dados, depois usar sed para substituir os caracteres inválidos por nada (eles não são necessários). Mas como você faz o sed funcionar em valores hexadecimais / binários em um arquivo?
Uma solução típica é usar iconv -c
.
Por resposta de Peter, usar o iconv é a solução típica que a maioria das pessoas usa para limpar os dados ruins. Se você quiser fazer alguma análise sobre os dados com antecedência (e talvez limpá-lo no banco de dados original), você pode usar o seguinte link para encontrar o ponto problemático.
De acordo com a substituição do sed binário no stackoverflow, sua melhor aposta é passar por hexdump
:
hexdump input | sed -e "..." | xxd -r -p output
Isso removerá todos os caracteres que estão fora do intervalo 0x32
(espaço) para 0x7e
(til):
someprog | LANG=C sed 's/[\x00-\x31\x7f-\xff]//g'
Você pode usar outros intervalos de caracteres para ser mais seletivo.
Um colega me deu uma dica na direção de Perl:
cat databasedump.sql | perl -pi-e / \ xc3 \ xa9 // g; ' > fixeddatabasedump.sql
Ok, então não é sed, mas pelo menos a sintaxe é mais ou menos a mesma.
tr -d '[:xdigit:]' < old_database > new_database
também pode funcionar.
tr -d exclui apenas '[:xdigit:]'
caracteres hexadecimais
Tags postgresql sed