Pergunta

Eu faço uma chamada para um procedimento armazenado do oracle usando JDBCTemplate que tem um parâmetro in / out de STRUCT. Um dos campos nesta estrutura é um VARCHAR que é atualizado dependendo da lógica do procedimento armazenado. No entanto, quando isso é retornado da chamada, ele contém apenas três pontos de interrogação - '???'. Este é possivelmente o trabalho do Riddler, mas parece mais um problema de codificação de char.

Isso funcionou bem até que mudamos os bancos de dados para um banco de dados que tinha uma codificação de caracteres de WE8ISO8859P15 (ISO8859). Isso foi recuperado fazendo:

SELECT NLS_CHARACTERSET FROM NLS_DATABASE_PARAMETERS

O conjunto de caracteres que funcionava anteriormente era WE8MSWIN1252 (MSWIN-1252), que funciona bem. Portanto, estou supondo que se trata de um problema de conjunto de caracteres, embora seja um pouco cauteloso, pois sempre retorna apenas 3 pontos de interrogação, independentemente de quanto texto deve ser retornado.

Até onde eu entendo, o driver JDBC subjacente (jdbc: oracle: thin) faz toda a codificação de caracteres automaticamente e converte o conjunto de caracteres do banco de dados em UTF-16 (codificação Java), no entanto, parece que isso não está acontecendo. Estou usando a classe StoredProcedure (parte do Spring) para chamar StoredProcedure.

Também tentei adicionar orai18n.jar ao classpath, mas sem sucesso. No entanto, parece muito incomum, considerando que o ISO-8859 é um conjunto de caracteres bastante padrão, então posso estar indo pelo caminho errado.

Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

Este era um problema de codificação de char devido à codificação de caracteres do banco de dados sendo armazenada como ISO-8859- 15 - a versão 15 deste padrão estava causando todos os problemas que é essencialmente a adição do símbolo do Euro.O driver oracle que estávamos usando para conectar via JDBC simplesmente não conseguia fazer a conversão de ISO-8859-15 para UTF-16 do Java.

Reverter para ISO-8859-1 ou mudar para a codificação UTF-8 no banco de dados (melhor) resolve isso.É possível que adicionar o jar orai18n ao classpath possa resolver isso, mas como não há um pacote OSGI disponível para isso, não foi feito tão facilmente.Minha recomendação é não se preocupar com bancos de dados Oracle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top