Работи, защото и двете условия са верни:
- Клиентският набор от знаци е равен на набора от знаци на вашата база данни.
- Наборът от знаци позволява всякакви стойности на байтове
Наборът от символи на вашата база данни и наборът от знаци на вашия клиент са зададени на US7ASCII . В такъв случай всички данни се записват/четат един по един без преобразуване, т.е. байтовете, които изпращате, се записват точно в базата данни. Вероятно не сте задали NLS_LANG изобщо от страната на вашия клиент, но Oracle го задава по подразбиране на AMERICAN_AMERICA.US7ASCII .
US7ASCII е 7-битово кодиране. Предполагам, че чисто ASCII приложение (което може да бъде доста трудно за намиране) просто би игнорирало 8-ия бит, който се съхранява в 8-битова архитектура. Други набори от знаци, напр. AL32UTF8 не позволявайте стойност на всеки байт. В този случай такива знаци ще бъдат заменени от контейнер, напр. ¿ или ? .
Забележете, вие задавате вашия клиентски набор от знаци на US7ASCII което най-вероятно не е правилно. Задайте го правилно към набора от знаци, който се използва от вашето приложение, след това ° ще бъдат заменени.
В случай, че използвате SQL*Plus, проверете кодовата страница на конзолата с командата chcp , респ. locale charmap . Задайте своя NLS_LANG съответно променлива на средата, преди да стартирате sqlplus.