Problemas com caracteres inválidos ao inserir no banco de dados

14 respostas
rafaelbtz

Bom dia,

Estou enfrentando um problema para inserir dados de arquivos textos em um banco de dados postgre. Acontece o seguinte:

PSQLException: Zero bytes não podem ocorrer em parâmetros de cadeia de caracteres

Quando eu abro o arquivo texto no java realmente existe um caracter inválido (daqueles que aparecem como um quadradinho), existe alguma maneira de eu retirar todos esses caracteres antes de gravar o arquivo no banco de dados?

Valeu.

14 Respostas

Balena

no próprio arquivo, copia um dos inválidos…
e dá um localizar e substituir e pronto.

rafaelbtz

mas é que eu não acesso os arquivos, eles são enviados pelos usuários via WEB para o servidor.

De la eu leio os arquivos e gravo no Banco de Dados.

Não tem como eu saber quais caracters inválidos podem vir, por isso minha idéia era tirar todos os caracteres que não são UTF-8 para depois gravar no banco.

Sera que da pra fazer isso.

E

Os arquivos são sempre texto?

rafaelbtz

Sim. Na verdade são XML’s SEMPRE.

Eu faço a conversão deles com Jaxb, lógico que da erro. Mas mesmo assim eu preciso gravar todo arquivo recebido em uma tabela de LOG. A coluna desta tabela é tipo String.

rafaelbtz

Ja pensei em trocar o tipo da coluna para Blob assim gravo o array de bytes. Mas o MALDITO dba num deixa.

E

Eles são sempre XML e sempre em UTF-8 ou eles podem estar em alguma outra codificação (tipo Windows-1252)? (Pelo que você esta falando pode ser que esses tais arquivos XML possam ter sido criados “manualmente” - e nesse caso vai dar alguns problemitas mesmo)

Hebert_Coelho

Como o entanglement disse, verifique se o XML está em UTF-8.

Quando você receber o arquivo você terá que mandar um replace no código.

Ou então, pagar umas berejas para o DBA. Quem sabe né…

rafaelbtz

Ai é que ta eles realmente podem vir em outra codificação.

Mas ai vai dar problema de parser no JAXB e o sistema não vai prosseguir com o processamento. O que está totalmente certo, pois os clientes são obrigados a enviar em UTF-8;

O que acontece é que quando ocorre essa falha eu preciso gravar o arquivo recebido em um log (no banco de dados). E esse maldita coluna é texto e não BLOB.

Não existe um jeito nem que eu tenha que fazer alguma coisa assim:

for(int i = 0; i < texto.length(); i++){

   if( ! isUTF8Valido(texto.charAt(i))) //não grava esse caracter

}

Esse método isUTF8Valido(char) existe algum jeito de cria-lo, existe algum teste que eu possa fazer com o caracter para saber se é um UTF-8 válido?

rafaelbtz

jakefrog:
Como o entanglement disse, verifique se o XML está em UTF-8.

Como eu faço isso?

rafaelbtz

Esse é o erro do parser:

org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the element content of the document

O único jeito que eu achei de testar é validar se a mensagem de erro começa em “An invalid XML character”, mas fiquei com nojo de fazer isso.

rafaelbtz

Alguem sabe me dizer quais os bytes válidos para uma sequencia UTF-8.

Neste caso especifico eu estou testando se algum dos bytes da String é igual a 0x00

Mas eu gostaria de testar o intervalo que é válido. Mas não achei nada sobre isso no Google.

E

Ah, só vou fazer um comentário. Por acaso o arquivo que o usuário pode subir pode ser muito grande, tão grande que não caiba numa coluna String do banco de dados? (Note que não conheço o PostgreSQL portanto não sei se existe ou não algum limite para isso). Se puder ser grande, então não vale a pena todo esse esforço, Ache um diretório onde você possa copiar esse arquivo errado, e ponha na tal coluna só o nome do arquivo.

rafaelbtz

O arquivo não pode ser grande não, tem uma validação pra isso.
Na verdade o arquivo não é enviado via upload existe um programa Swing que envia e ele valida.

Mas a ideia é boa gravar no HD direto.

Balena

usa regex, assim você consegue dizer oque é válido e o que é inválido.

Criado 16 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 14
Participantes 4