Funguje to, protože obě následující podmínky jsou pravdivé:
- Znaková sada klienta se rovná znakové sadě vaší databáze.
- Znaková sada povoluje libovolné bajtové hodnoty
Vaše znaková sada databáze a znaková sada klienta jsou nastaveny na US7ASCII . V takovém případě jsou všechna data zapisována/čtena jedno po druhém bez jakékoli konverze, tj. vámi zaslané bajty jsou přesně zapsány do databáze. Pravděpodobně jste nenastavili NLS_LANG vůbec na straně vašeho klienta, ale Oracle to nastaví na AMERICAN_AMERICA.US7ASCII .
US7ASCII je 7bitové kódování. Předpokládám, že čistá ASCII aplikace (kterou by mohlo být docela obtížné najít) by prostě ignorovala 8. bit, který je uložen v 8bitové architektuře. Další znakové sady, např. AL32UTF8 nepovolit každou hodnotu bajtu. V tomto případě budou takové znaky nahrazeny zástupným symbolem, např. ¿ nebo ? .
Poznámka:znakovou sadu klienta nastavíte na US7ASCII což s největší pravděpodobností není správné. Nastavte jej správně na znakovou sadu, kterou používá vaše aplikace, poté ° bude nahrazen.
V případě, že používáte SQL*Plus, zkontrolujte kódovou stránku konzoly příkazem chcp , resp. locale charmap . Nastavte NLS_LANG před spuštěním sqlplus.