Isto é o que provavelmente acontece:
- O conjunto de caracteres do seu cliente deve ser algo como CP1252 ou ISO-8859-15, enquanto na verdade seu cliente realmente usa UTF8.
- Neste conjunto de caracteres (UTF8), o símbolo
á
leva dois bytes, então seu cliente envia esses dois bytes, enquanto diz ao Oracle para tratá-los como CP1252. No CP1252 os dois bytes codificam para dois caracteres que resultam no DB interpretando a entrada como dois caracteres, portantolength('à')
igual a 2 (e se você inserir esta string o resultado da inserção não será igual aà
) - Quando você define corretamente o conjunto de caracteres, a entrada é tratada corretamente pelo oracle como um único caractere e seu comprimento é 1 (ainda dois bytes).
Conclusão:defina o conjunto de caracteres do cliente corretamente ou você obterá erros de tradução (você não obterá caracteres ilegais dessa maneira, mas poderá obter símbolos estranhos (
¿
). O conjunto de caracteres do banco de dados é definido no momento da criação e geralmente é alterado por meio de exportação/criação de banco de dados/importação em branco.