Início > Programação > Como Contornar Problemas de Encoding no Banco de Dados

Como Contornar Problemas de Encoding no Banco de Dados

Quando strings são inseridas no banco de dados diretamente via script, a aplicação não tem controle sobre o tipo de encoding que foi utilizado. Tentei forçar o encoding dessas strings para UTF-8 estaticamente no header da página e manualmente no código Java, mas nada funcionava.

Comecei a analisar o que ocorria no banco de dados. O NLS_CHARACTERSET define, no banco de dados Oracle, quais caracteres poderão ser armazenados utilizando os tipos de dados CHAR, VARCHAR2, LONG e CLOB. Rodei a consulta abaixo que foi indicada aqui e vi que o encoding setado era WE8MSWIN1252, o que não permite acentuação:

SELECT VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_CHARACTERSET';

Esperava que o resultado dessa consulta fosse UTF8 ou algo como AL32UTF8, que de acordo com esse fórum é um subtipo de UTF-8 que utiliza um espaço de armazenamento maior (4 bytes ao invés de 2), tem todos os caracteres do super-tipo e ainda possui caracteres extras.

Após uma conversa com o DBA, descobri que os caracteres acentuados eram concatenados ao resultado no meio da implementação da procedure que era chamada pela aplicação. Sendo assim, procurei outra abordagem.

Um colega me contou que o Oracle tem funções que permitem descobrir qual é o código ASCII correspondente a um caractere e vice-versa. Algo equivalente ao que fazemos em Java:

int charToAscii(char character){
return (int)character;
}

char asciiToChar(int ascii){
return (char)ascii;
}

Para descobrir o caractere correspondente ao código ASCII, utilize a função CHR([CODIGO_ASCII]) e para descobrir o código ASCII correspondente ao caractere utilize a função ASCII([CARACTERE]). Exemplo:

-- para descobrir o caractere correspondente ao código ASCII 231
SELECT CHR(231) FROM DUAL;

-- para descobrir o código ASCII correspondente ao caracteres 'ç'
SELECT ASCII('ç') FROM DUAL;

Conhecendo o código do caractere, podemos alterar nossa stored procedure:

CREATE OR REPLACE PROCEDURE findDica(
	   dica OUT VARCHAR2)
IS
BEGIN

  SELECT 'Dirija com seguran' || CHR(231) || 'a, amigo.'
  INTO dica 
  FROM  DUAL;

END;
/
Anúncios
Categorias:Programação Tags:,
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: