Возможно, это последний запасной уровень, если вы нигде не устанавливаете кодировку соединения (я не знаю). Но если персонаж не может быть физически сохранен на сервере, у Oracle нет способа выяснить, каким символом он должен был быть.

есть база данных Oracle, которая имеетNLS_CHARACTERSET = US7ASCII.

В качестве теста мы запустили вставку в таблицу, которая содержитVARCHAR(4000) поле, как смогли поставитьCHR(176) значение в этом столбце (degrees symbol).

Этот персонаж не поддерживаетсяUS7ASCII.

Почему база данных позволяет хранить это значение в этом столбце?

 Álvaro González31 окт. 2017 г., 17:25
Преобразование набора символов в одноязычном сценарии: "Когда целевой набор символов не содержит всех символов в исходных данных, используются замещающие символы. Если, например, сервер использует US7ASCII, а немецкий клиент использует WE8ISO8859P1, тогда немецкий символß заменяется на? а такжеä заменяется наa«.
 Matthew Walk31 окт. 2017 г., 17:56
При просмотре через разработчика Oracle SQL он выглядит как вертикальный прямоугольный символ. При просмотре через Aqua Data studio он отображается как символ градусов.
 Álvaro González31 окт. 2017 г., 17:21
Там должно быть что-то еще происходит, потому чтоUS7ASCII это 7-битная кодировка, которая не поддерживает«Знак градуса» (U + 00B0) так что вы должны получать буквальный? вопросительный знак по возвращении (или, возможно, другой символ замены). Вы можете обратиться к Руководству по поддержке глобализации Google, которое объясняет это довольно хорошо. Странный.
 Wernfried Domscheit31 окт. 2017 г., 17:55
Смотрите этот ответ:stackoverflow.com/questions/36710360/...

Ответы на вопрос(2)

потому что Oracle будет обрабатывать преобразование набора символов для вас.

Более подробную информацию можно найти здесь:Специальные символы в Oracle

 Álvaro González31 окт. 2017 г., 17:18
Это верно, но разве он не должен получать? скорее, чем°?
 cdb_dba31 окт. 2017 г., 17:37
Разве это не меняется в зависимости от набора символов операционной системы? Я был уверен, что то, что отображается, зависит от языка / набора символов ОС.
 Álvaro González31 окт. 2017 г., 17:45
Возможно, это последний запасной уровень, если вы нигде не устанавливаете кодировку соединения (я не знаю). Но если персонаж не может быть физически сохранен на сервере, у Oracle нет способа выяснить, каким символом он должен был быть.

Набор символов клиента совпадает с набором символов вашей базы данных.Набор символов разрешает любые байтовые значения

Ваш набор символов базы данных и ваш набор символов клиента установлены наUS7ASCII, В этом случае каждая информация записывается / читается одна за другой без какого-либо преобразования, то есть отправляемые вами байты точно записываются в базу данных. Вероятно, вы не установилиNLS_LANG на стороне клиента, но по умолчанию OracleAMERICAN_AMERICA.US7ASCII.

US7ASCII это 7-битная кодировка Я предполагаю, что чистое ASCII-приложение (которое может быть довольно сложно найти) просто игнорирует 8-й бит, который хранится в 8-битной архитектуре. Другие наборы символов, напримерAL32UTF8 не разрешать каждое значение байта. В этом случае такие символы будут заменены местозаполнителем, например,¿ или же?.

Обратите внимание, вы установили свой клиентский набор символов наUS7ASCII что, скорее всего, не правильно. Установите его правильно на набор символов, который используется вашим приложением, затем° будет заменен.

Если вы используете SQL * Plus, проверьте кодовую страницу консоли командойchcpсоответственноlocale charmap, Установите свойNLS_LANG соответственно переменная окружения перед запуском sqlplus.

Ваш ответ на вопрос