Драйвер OCI JDBC и настройки NLS - PullRequest
2 голосов
/ 02 ноября 2011

Мы создали триггер «после входа», чтобы изменить сеанс, чтобы установить две настройки NLS - NLS_SORT и NLS_COMP. NLS_SORT должен быть установлен в BINARY_CI, а NLS_COMP должен быть в LINGUISTIC. Запрашивая представление V $ NLS_PARAMETERS после установления соединения для проверки значений, я вижу, что параметр NLS_COMP обновляется, а NLS_SORT - нет.

После более подробного изучения я понял, что драйвер OCI JDBC выполняет приведенный ниже запрос после установления соединения

        ALTER SESSION SET NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA'

Поскольку NLS_SORT получает свои значения из NLS_LANGUAGE, значение параметра NLS_SORT сбрасывается в BINARY вместо BINARY_CI. Параметр NLS_LANGUAGE берется из реестра Windows.

  1. Выполняет ли драйвер oci jdbc эти запросы для синхронизации настроек NLS на клиенте с настройками сервера базы данных?

  2. Можно ли настроить драйвер jdbc oci, чтобы избежать выполнения запроса NLS_LANGUAGE изменения набора сеанса?

Причина, по которой я задаю второй вопрос, заключается в том, что для сервера приложений (например, glassfish, tomcat, jboss) (на котором установлен клиент OCI) не имеет смысла переопределять настройки сервера базы данных.

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Я столкнулся с точно такой же проблемой после введения триггера при входе в систему для установки этих значений.

  1. "Назначение настроек NLS_LANGUAGE и NLS_TERRITORY - сообщить базе данных информацию о локали. Они получены из настройки NLS_LANG на клиенте (но также могут быть изменены). Эти настройки позволяют базе данных отправлять данные обратно клиент в ожидаемом формате и на языке. " - взято с здесь
  2. Нет, его нельзя настроить, чтобы избежать этого выполнения, хотя это может быть будущей функцией. Похоже, что единственное решение состоит в том, чтобы приложение всегда меняло эти параметры после входа в систему.

Может быть полезно знать, что если вы используете тонкий соединитель, а не драйвер OCI, и вы установили триггер при входе в систему, эти значения будут установлены правильно после входа в систему. Проблема здесь заключается в том, что драйвер OCI устанавливает эти значения в соответствии с NLS_LANG только после выполнения триггера входа в систему.

0 голосов
/ 17 февраля 2017

Согласно главе 19 Поддержка глобализации из Домашняя страница / База данных / Онлайн-документация по базе данных Oracle 12c, выпуск 1 (12.1) / Разработка приложений / Руководство по разработке базы данных JDBC :

Начиная с Oracle Database 10g, переменная NLS_LANG больше не является частью механизма глобализации JDBC.Драйвер JDBC не проверяет среду NLS.Таким образом, его установка не имеет никакого эффекта.

ALTER SESSION утверждение, которое вы наблюдали, вероятно, исходит из следующего утверждения из Поддержка глобализации для драйверов JDBC разделаглава 9 Java-программирование в глобальной среде из Руководство по поддержке глобализации базы данных Oracle9i (выпуск 2 (9.2)) :

Во время подключения к базе данных JDBCБиблиотека классов устанавливает параметры сервера NLS_LANGUAGE и NLS_TERRITORY в соответствии с локалью виртуальной машины Java, на которой работает драйвер JDBC.Эта операция выполняется только для тонких драйверов JDBC OCI и JDBC и обеспечивает взаимодействие сервера и клиента Java на одном языке.

...