Działa, ponieważ oba warunki są spełnione:
- Zestaw znaków klienta jest równy zestawowi znaków bazy danych.
- Zestaw znaków pozwala na dowolne wartości bajtowe
Twój zestaw znaków bazy danych i zestaw znaków klienta są ustawione na US7ASCII . W takim przypadku każda z danych jest zapisywana/odczytywana jedna po drugiej bez jakiejkolwiek konwersji, tzn. wysyłane bajty są dokładnie zapisywane w bazie danych. Prawdopodobnie nie ustawiłeś NLS_LANG w ogóle po stronie klienta, ale Oracle domyślnie wybiera AMERICAN_AMERICA.US7ASCII .
US7ASCII to kodowanie 7-bitowe. Zakładam, że czysta aplikacja ASCII (która może być dość trudna do znalezienia) po prostu zignorowałaby ósmy bit, który jest przechowywany w architekturze 8-bitowej. Inne zestawy znaków, m.in. AL32UTF8 nie zezwalaj na każdą wartość bajtową. W takim przypadku takie znaki zostaną zastąpione przez symbol zastępczy, np. ¿ czy ? .
Pamiętaj, że ustawiłeś zestaw znaków klienta na US7ASCII co najprawdopodobniej nie jest poprawne. Ustaw go poprawnie na zestaw znaków używany przez twoją aplikację, a następnie ° zostanie zastąpiony.
W przypadku korzystania z SQL*Plus sprawdź stronę kodową konsoli poleceniem chcp ewent. locale charmap . Ustaw swój NLS_LANG odpowiednio zmienna środowiskowa przed uruchomieniem sqlplus.