Caracteres especiais em banco legado: isolar o driver antigo em vez de brigar com ele
Quando o driver moderno corrompe acentos ao gravar, um componente pequeno com o driver antigo resolve sem contaminar o resto do sistema.
O sintoma é conhecido: o texto entra com acento e cedilha e chega na base como ? ou como caracteres trocados. Ou pior, a gravação falha com erro de conversão. O sistema é moderno, o banco de dados legado não é. Vale para qualquer banco antigo com charset próprio.
Onde o problema costuma nascer
A cadeia tem três pontos de conversão de caracteres, e o erro está em algum deles:
- A aplicação: a JVM trabalha em Unicode.
- O driver: converte de Unicode para o charset da conexão.
- O servidor: tem um charset padrão, muitas vezes antigo, e um charset por banco.
Se o charset da conexão e o do servidor não conversam, há perda. Antes de mudar qualquer coisa, meça: consulte o charset do servidor e o da sessão, e grave uma string de teste com os caracteres problemáticos.
A tentação errada
Trocar o driver da aplicação inteira, ou sanitizar o texto na entrada removendo acentos. A primeira quebra o que funciona. A segunda destrói dado do usuário.
A solução pragmática: um componente isolado
Quando a versão antiga do driver é a única que grava corretamente, não tente fazer o resto do sistema conviver com ela. Confine-a:
// Fronteira estreita: o sistema só conhece esta interface
public interface GravadorLegado {
void gravar(RegistroLegado registro);
}
O driver antigo, e só ele, vive em um módulo separado, com classpath próprio, ou em um serviço pequeno atrás dessa interface. O restante da aplicação continua com o driver moderno.
O que isso compra
- Contenção: o risco do driver antigo fica em um lugar só.
- Testabilidade: a interface permite testar com um fake.
- Saída futura: no dia em que o banco migrar, troca-se uma implementação e não o sistema.
Cuidados
- Documente por que a versão antiga é necessária, com a versão exata e o comportamento que ela corrige. Sem isso, alguém "atualiza" o driver e o problema volta.
- Escreva um teste de integração com acentos, cedilha e caracteres fora do Latin-1. Ele é o guardião dessa decisão.
- Trate o componente como dívida assumida, com dono e prazo de revisão.