Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






При конвертации возможно повреждение данных, если набор символов сессии клиента не является подмножеством (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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.