Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Se temos o conjunto de caracteres US7ASCII, por que ele nos permite armazenar caracteres não ASCII?


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.