![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
При конвертации возможно повреждение данных, если набор символов сессии клиента не является подмножеством (subset) набора символов БД.
Набор символов А является подмножеством набора символов Б, если любой символ из набора А корректно отображается при преобразовании его символ набора Б. Если же между наборами символов нет отношения «множество-подмножетво», то при конвертации происходит потеря символьных данных. Часто в этом случае они представляются в виде символа вопроса «?».
Для того, чтобы определить, является ли набор символов подмножеством другого, можно использовать функцию CONVERT. Пример использования функции CONVERT. SELECT CONVERT('йцукенг', 'CL8MSWIN1251', 'US7ASCII') FROM DUAL;
CONVERT ------- ???????
SELECT CONVERT('qwerty', 'CL8MSWIN1251', 'US7ASCII') FROM DUAL;
CONVER ------ qwerty
Например, набор US7ASCII является подмножеством практически всех наборов символов, т.к. именно он используется для отображения SQL и PL/SQL-выражений. Если вы хотите использовать отличные от этого списка символы, вам нужно выбрать подходящий набор символов для вашей БД.
Любой клиент СУБД Oracle 10gимеет переменную окружения NLS_LANG (обычно прописываемую в реестре, если это Windows, или в конфигурационных файлах, если это Linux), которая отражает настройки ОС той БД, с которой проводится работа. С ее помощью должна корректно преобразовываться получаемая от сервера БД информация, как собственно данные, так и служебные сообщения. Если значение этой переменной совпадает с соответствующими параметрами БД, то не производится никаких дополнительных проверок и преобразований. Иначе возможны преобразования, которые могут повлечь дополнительные расходы вычислительных ресурсов.
Составляющие NLS_LANG
Из чего состоит переменная NLS_LANG? Её общий вид следующий:
NLS_LANG = language_territory.charset
- Язык (LANGUAGE) – определяет имена месяцев, имена дней, направление текста (слева направо или справа налево, сверху вниз или наоборот), сокращения для времени до и после полуночи, сокращения для дат до нашей и нашей эры. Если не указан, по умолчанию будет взято значение AMERICAN. - Территория (TERRITORY) – определеляет настройки календаря (например, первый день недели), формат даты, числовой формат (разделитель дробной части, разделитель групп разрядов, система мер, настройки округления), формат денежной единицы (символ, интернациональное сокращение, разделитель дробной части, символы дебета/кредита и др.). Если не указан, будет взято значение, соответствующее языку (например, языку AMERICAN будет соответствовать территория AMERICA, языку RUSSIAN будет соответствовать территория CIS). - Набор символов (CHARACTER SET) – отображение символов, отображение и конвертацию заглавных и прописных букв, порядок замещения символов при преобразовании (например, символ «ä» может быть преобразовано просто в «a») и др. Каждому языку поставлен в соответствие некоторый набор символов по умолчанию.
Когда нужен Unicode
В случае, если в вашей системе планируется поддержка нескольких языков, необходимо выбрать набор, содержащий все необходимые символы. В подобных случаях Oracle рекомендует использовать наборы символов Unicode (в версии СУБД Oracle 10grelease 2 поддерживается Unicode 3.1). Для обработки символьных данных, требующих более чем одного байта для представления символа, используются типы данных и функции SQL, часто начинающиеся с “N” (например, NCHAR, NCLOB и т.д.), что говорит о предназначении их для обработки многобайтовых символьных данных. В СУБД Oracle 10gданные столбцов с типом NCHAR хранятся в кодировке Unicode независимо от основного набора символов БД. В отличие от предыдущих версий в СУБД Oracle 10gдля национальных наборов символов представлены всего 2 Unicode-набора: UTF8 и AL16UTF16.
NLS-представления словаря данных
Для того, чтобы узнать текущие NLS-параметры на уровне сессии, экземпляра или БД, существует 3 представления словаря:
NLS_SESSION_PARAMETERS – NLS-параметры для текущей сессии (в т.ч. и измененные с помощью ALTER SYSTEM). Не отображает информацию о наборе символов в БД, в которой сессия запущена. NLS_INSTANCE_PARAMETERS – NLS-параметры уровня экземпляра. NLS_DATABASE_PARAMETERS – NLS-параметры уровня БД. Отображаются оба набора символов БД.
Например:
select * from nls_database_parameters;
PARAMETER VALUE ------------------------------ ---------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS., NLS_CHARACTERSET CL8MSWIN1251 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET UTF8 NLS_RDBMS_VERSION 9.2.0.4.0
Практический каждый из перечисленных параметров имеет аналог в файле инициализации. Параметры NLS_LANGUAGE и NLS_TERRITORY являются аналогами языка и территории переменной ОС NLS_LANG, и влияют на остальные. NLS_LANGUAGE - зависит от переменной окружения NLS_LANG – язык, используемый в БД. Влияет на значения по умолчанию для NLS_DATE_LANGUAGE и NLS_SORT. NLS_TERRITORY– влияет на NLS_DATE_FORMAT, NLS_NUMERIC_CHARACTERS, NLS_CURRENCY, и NLS_ISO_CURRENCY. NLS_LENGTH_SEMANTICS – определяет, как будет вычисляться длина символьных полей: побайтно или посимвольно (BYTE или CHAR). В однобайтовых БД его значение несущественно. Влияет только на новые столбцы, не затрагивая существующие. NCHAR, NVARCHAR2, CLOB, and NCLOB всегда символьно-вычисляемые. NLS_NUMERIC_CHARACTERS – зависит от NLS_TERRITORY. Разделить дробной части, и разделитель групп разрядов. Установка этого параметра перекроет значение, сформированное NLS_TERRITORY. Например, разделитель дробной части – запятая, разделитель групп разрядов – пробел. Установка этого параметра может сказаться на правильной работе программых модулей. NLS_SORT – способ сортировки в выражении ORDER BY, зависит от NLS_LANGUAGE. Возможны разные значения этого параметра. BINARY – сортировка, ориентированная на двоичные числовые коды символов в наборе (выполняется быстрее, оптимизатор использует индексы в плане выполнения). Могут использоваться также некоторый именованные способы лингвистической сортировки (для многих языков есть готовые). Установка значения этого параметра, отличного от BINARY приведет к тому, что оптимизатор будет использовать полные табличные сканирования и не будет использовать индексы, т.к. индексы строятся на основе двоичного порядка ключей (соответствующего BINARY). Это может существенно снизить производительность. Для того, чтобы использовать лингвистические методы сортировки в отдельно взятых запросах, можно использовать функцию NLSSORT. Например,
CREATE TABLE test (name VARCHAR2(15)); INSERT INTO test VALUES ('Gaardiner'); INSERT INTO test VALUES ('Gaberd');
SELECT * FROM test ORDER BY name;
NAME --------------- Gaardiner Gaberd
SELECT * FROM test ORDER BY NLSSORT(name, 'NLS_SORT = XDanish');
NAME --------------- Gaberd Gaardiner Изменение основного набора символов БД
Рассмотрим пример. В системе создается БД следующего вида:
… CREATE DATABASE qwerty MAXINSTANCES 1 MAXLOGHISTORY 1 MAXLOGFILES 5 MAXLOGMEMBERS 3 MAXDATAFILES 100 DATAFILE 'E: \oracle\oradata\qwerty\system01.dbf' SIZE 250M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE 'E: \oracle\oradata\qwerty\temp01.dbf' SIZE 40M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED UNDO TABLESPACE " UNDOTBS1" DATAFILE 'E: \oracle\oradata\qwerty\undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
|