Anti-padrões, 15/10/2026, 7 min de leitura

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:

  1. A aplicação: a JVM trabalha em Unicode.
  2. O driver: converte de Unicode para o charset da conexão.
  3. 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.