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

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.

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

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.

Os arquivos são sempre texto?

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.

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

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)

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é…

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?

[quote=jakefrog]Como o entanglement disse, verifique se o XML está em UTF-8.
[/quote]

Como eu faço isso?

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.

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.

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.

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.

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