Funciona porque as seguintes condições são verdadeiras:
- O conjunto de caracteres do cliente é igual ao conjunto de caracteres do banco de dados.
- O conjunto de caracteres permite qualquer valor de byte
Seu conjunto de caracteres de banco de dados e seu conjunto de caracteres de cliente são definidos como
US7ASCII . Nesse caso, cada dado é escrito/lido um a um sem nenhuma conversão, ou seja, os bytes que você envia são escritos exatamente no banco de dados. Provavelmente você não definiu NLS_LANG em tudo no seu lado do cliente, mas o padrão da Oracle é AMERICAN_AMERICA.US7ASCII . US7ASCII é uma codificação de 7 bits. Suponho que um aplicativo ASCII puro (que pode ser bastante difícil de encontrar) simplesmente ignoraria o 8º bit que é armazenado em uma arquitetura de 8 bits. Outros conjuntos de caracteres, por ex. AL32UTF8 não permita cada valor de byte. Nesse caso, esses caracteres serão substituídos por um espaço reservado, por exemplo. ¿ ou ? . Observe que você define o conjunto de caracteres do cliente como
US7ASCII o que provavelmente não está correto. Defina-o corretamente para o conjunto de caracteres usado pelo seu aplicativo e, em seguida, ° será substituído. Caso você use o SQL*Plus, verifique a página de código do console com o comando
chcp , resp. locale charmap . Defina seu NLS_LANG variável de ambiente de acordo antes de iniciar o sqlplus.