ПРИЛОЖЕНИЕ E

        ----------------------------------------------------------------

        ПОДДЕРЖКА НАЦИОНАЛЬНЫХ ЯЗЫКОВ



        Это приложение описывает средства поддержки национальных  языков
        (NLS),   которые   позволяют   приложениям   ORACLE   работать с
        различными языками, используя соглашения, заданные пользователем
        приложения.   Темы  этой  главы  включают  обсуждение  следующих
        вопросов:

            *  спецификация наборов символов

            *  спецификация умалчиваемого зависящего от языка поведения

            *  форматы дат и чисел

            *  использование параметров NLS в функциях SQL










































                                      Поддержка национальных языков  E-1


----------------

Специфицирование наборов символов

        Если приложение-клиент работает на терминале, использующем  иной
        набор  символов,   чем  база   данных,  то   символы  приложения
        необходимо преобразовывать  в символы  базы данных,  и наоборот.
        Это  преобразование  выполняется  автоматически  и прозрачно для
        приложения.  Набор символов, используемый  приложением-клиентом,
        определяется параметром NLS_LANG.


Преобразование набора символов
------------------------------

        Для  конкретных  символов  в  рамках определения набора символов
        могут быть определены  заменяющие символы.  Там,  где заменяющий
        символ не определен,  будут использоваться умалчиваемые  символы
        замены.  Чтобы  избежать замены  символов при  преобразовании из
        набора символов клиента в набор символов базы данных,  последний
        должен  быть  выбран  как  надмножество  всех  наборов  символов
        клиентов.

        Обязанность приложения  - гарантировать,  чтобы данные,  которые
        извлекаются из базы данных,  были пригодны для преобразования  в
        набор символов клиента.   Например, вряд ли  приемлемо извлекать
        символьные данные в наборе символов ISO8859/5 Latin/Greek,  если
        приложение клиента работает на терминале, использующем 7-битовую
        кодовую таблицу ASCII,  особенно если данные  содержат греческие
        символы.  При таких  преобразованиях все символы  будут заменены
        соответствующими заместителями.

        Для  некоторых  приложений,  однако,  такая подстановка символов
        может быть желательной, - например, если данные извлекаются  для
        вывода на дисплей, а символы-заместители обеспечивают приемлемое
        представление данных.  По этой причине (а также ввиду того,  что
        "приемлемость"  преобразования   наборов  символов   зависит  от
        конкретных  данных),  на  эти  преобразования  налагается   мало
        ограничений.

        Так  как  ORACLE   поддерживает  много  наборов   символов,  как
        однобайтовых,   так   и   мультибайтовых,   существует множество
        возможных комбинаций преобразований.   В общем, такая  конверсия
        поддерживается   между   любыми   двумя   однобайтовыми наборами
        символов, для ограниченных комбинаций мультибайтовых наборов,  и
        между  одним   однобайтовым  и   одним  мультибайтовым   набором
        символов.


Хранение данных в мультибайтовых наборах символов
-------------------------------------------------

        Спецификация ширины для символьных типов данных CHAR и  VARCHAR2
        задается в байтах, а не в символах.  Следовательно, спецификация
        CHAR(20)  в  определении  таблицы  отводит  20  байт  банных для
        хранения символьных данных.

        Если набор символов базы данных однобайтовый, то число  символов
        совпадает  с  числом  байт.   Если  набор  символов  базы данных
        мультибайтовый,  то  в  общем  случае  такого  соответствия нет.



E-2  Руководство разработчика приложений


        Различные  символы  могут  занимать  один  или несколько байт, в
        зависимости  от  специфической  схемы  кодирования  и от наличия
        кодов  регистров.   Поэтому  ширина  столбцов должна подбираться
        тщательно,  чтобы  позволять  размещение  максимально возможного
        числа байт при заданном количестве символов.


----------------

Задание умалчиваемого языкового поведения

        Эта  секция  описывает  параметры  инициализации  NLS_LANGUAGE и
        NLS_TERRITORY,  которые   специфицируют  умалчиваемое   языковое
        поведение любой сессии.


Параметр NLS_LANGUAGE
---------------------

        Сообщения,  выдаваемые  сервером,  хранятся  в  файлах двоичного
        формата,  которые  размещаются  в  каталоге  ora_rdbms  или  его
        эквиваленте.  (Обратитесь к вашему руководству по инсталляции за
        сведениями о местоположении этих файлов в вашей системе.)  Могут
        существовать  множественные  версии  этих  файлов,  по одной для
        каждого поддерживаемого языка.  Имена этих файлов формируются по
        следующему соглашению:

        <продукт><язык>.MSB

        Например,  файл,  содержащий  сообщения  сервера  на французском
        языке,   имеет   имя   ORAF.MSB,   где   'F'  представляет собой
        обозначение, используемое для языка French.


----------------

Форматы чисел и дат

        Для  функций  TO_CHAR,   TO_DATE  и  TO_NUMBER   предоставляются
        несколько  масок  формата,  чтобы  форматировать  даты и числа в
        соответствии с действующими соглашениями.

Форматы дат
-----------

        Элемент  формата  RM  (римский  месяц)  возвращает месяц в форме
        римского числа.  Допускаются как прописные (RM), так и  строчные
        (rm)  написания.   Например,  для  даты  7  сентября  1992 маска
        формата  'DD-rm-YY'  возвратит   '07-ix-92',  а  маска   формата
        'DD-RM-YY' возвратит '07-IX-92'.

[!]     Замечание: Маски формата MON  и DY явно поддерживают  сокращения
        названий месяцев и  дней, длина которых  отлична от 3  символов.
        Например, для французских названий дней 'Lundi' и 'Mardi'  могут
        быть специфицированы сокращения 'Lu' и 'Ma', соответственно.


Соглашения о нумерации недель и дней

        Номер  недели,  возвращаемый  маской  формата  WW,   вычисляется
        согласно  алгоритму  int((day-jan1)/7).   Этот  алгоритм расчета
        номера недели не соответствует стандарту ISO 2015 1992-06-15.

                                      Поддержка национальных языков  E-3


        Для  поддержки  стандарта  ISO  предусмотрен элемент формата IW,
        который  возвращает  номер  недели  ISO.  Кроме  того,  элементы
        формата I, IY,  IYY и IYYY  эквавалентны по поведению  элементам
        формата Y, YY, YYY и  YYYY, возвращая год, относящийся к  номеру
        недели ISO.

        В стандарте  ISO, год,  относящийся к  номеру недели  ISO, может
        отличаться  от  календарного  года.   Например,  1  января  1988
        попадает  на  53-ю  неделю  ISO  для  1987  года.  Неделя всегда
        начинается с понедельника и заканчивается воскресеньем.

            *  Если 1 января падает на пятницу, субботу или воскресенье,
               то  неделя,  включающая  1  января,  считается  последней
               неделей  предыдущего  года,  потому  что большинство дней
               этой недели принадлежат предыдущему году.

            *  Если 1 января падает  на понедельник, вторник, среду  или
               четверг, то  эта неделя  считается первой  неделей нового
               года, потому что большинство дней этой недели принадлежат
               новому году.

        Например,  1  января  1991  падает  на вторник, поэтому неделя с
        понедельника,  31  декабря  1990  по  воскресенье, 6 января 1991
        считается  неделей   1.   Чтобы   получить  номер   недели  ISO,
        используйте маску формата 'IW' для номера недели и одну из масок
        вида 'IY' для года.   Обратитесь к документу ORACLE7  Server SQL
        Language  Reference  Manual  для  дополнительной  информации  об
        использовании масок формата для дат.


Числовые форматы
----------------

        Для форматирования чисел предусмотрено несколько  дополнительных
        элементов формата:

            *  D возвращает десятичный разделитель

            *  G возвращает групповой разделитель

            *  L возвращает местный символ валюты

            *  C возвращает международный символ валюты

            *  RN возвращает число римскими цифрами

        Для  римских  числительных  можно  специфицировать как прописные
        (RN),  так  и  строчные  (rn)  начертания.   Преобразуемое число
        должно быть в интервале от 1 до 3999.














E-4  Руководство разработчика приложений


----------------

Использование параметров NLS в функциях SQL

        Все  символьные  функции  поддерживают  как  однобайтовые, так и
        мультибайтовые  символы.   За  исключением  явно   оговариваемых
        случаев,  символьные   функции  оперируют   посимвольно,  а   не
        побайтно.

        Все функции  SQL, поведение  которых зависит  от соглашений NLS,
        позволяют специфицировать параметры NLS. Это следующие функции:

            *  TO_CHAR

            *  TO_DATE

            *  TO_NUMBER

            *  NLS_UPPER

            *  NLS_LOWER

            *  NLS_INITCAP

            *  NLSSORT

        Явное  задание  необязательных  параметров  NLS для этих функций
        позволяет  им  быть  независимыми  от  значений  параметров NLS,
        действующих для текущей сессии.  Это средство может быть  важным
        для тех предложений  SQL, которые содержат  числа и даты  в виде
        строковых литералов.

        Например,  следующий  запрос  выполняется  корректно  лишь в том
        случае, если для дат используется язык American:

        SELECT ENAME FROM EMP
        WHERE HIREDATE > '1-JAN-91'

        Чтобы сделать такой запрос  не зависящим от текущего  языка дат,
        его следует исправить следующим образом:

        SELECT ENAME FROM EMP
        WHERE HIREDATE > TO_DATE ('1-JAN-91', 'DD-MON-YY',
                                  'NLS_DATE_LANGUAGE = AMERICAN')

        Таким способом можно определять предложения SQL, не зависящие от
        текущего  языка,  когда  это  необходимо.  Например, такого типа
        предложения  могут  быть  необходимы,  когда  строковые литералы
        используются  в  предложениях  SQL  внутри  обзоров, ограничений
        CHECK или триггеров.


Умалчиваемые спецификации
-------------------------

        При  вычислении  обзоров  и  триггеров,  умалчиваемые   значения
        параметров NLS для функций SQL берутся из значений,  действующих
        в данный момент для  сессии.  При вычислении ограничений  CHECK,
        такие  значения   берутся  из   параметров  NLS,   которые  были
        специфицированы при создании базы данных.



                                      Поддержка национальных языков  E-5


Специфицирование параметров
---------------------------

        Синтаксис параметров NLS для функций SQL имеет следующий вид:

        'параметр = значение'

        Могут быть специфицированы следующие параметры NLS:

            *  NLS_DATE_LANGUAGE

            *  NLS_NUMERIC_CHARACTERS

            *  NLS_CURRENCY

            *  NLS_ISO_CURRENCY

            *  NLS_SORT

        Для  каждой   конкретной  функции   SQL  определены   допустимые
        параметры NLS, а именно:

            *  TO_DATE:       NLS_LANGUAGE

            *  TO_NUMBER:     NLS_NUMERIC_CHARACTERS, NLS_CURRENCY,
                              NLS_ISO_CURRENCY

            *  TO_CHAR:       NLS_DATE_LANGUAGE, NLS_NUMERIC_CHARACTERS,
                              NLS_CURRENCY, NLS_ISO_CURRENCY

            *  NLS_UPPER:     NLS_SORT

            *  NLS_LOWER:     NLS_SORT

            *  NLS_INITCAP:   NLS_SORT

            *  NLSSORT:       NLS_SORT

        Примеры использования параметров NLS:

        TO_DATE('1-JAN-89', 'DD-MON-YY', 'nls_date_language = American')

        TO_CHAR (hiredate, 'DD/MON/YY', 'nls_date_language = French')

        TO_NUMBER ('13.000,00', '99G999D99',
            'nls_numeric_characters = ''.,''')

        TO_CHAR (sal, '9G999D99L', 'nls_numeric_characters = ''.,''
            nls_currency = Japan')

        NLS_UPPER (ename, 'nls_sort = Austrian')

        NLSSORT (ename, 'nls_sort = German')

        Замечание: В некоторых языках определенным строчным буквам могут
        соответствовать комбинации  прописных букв,  или наоборот.   Как
        следствие,  длина   результирующей  строки   функции  NLS_UPPER,
        NLS_LOWER и NLS_INITCAP может отличаться от длины входной строки
        символов.




E-6  Руководство разработчика приложений


Неприемлемые параметры
----------------------

        Заметьте, что NLS_LANGUAGE и NLS_TERRITORY не входят в множество
        допустимых параметров  NLS для  функций SQL.  Допустимы лишь  те
        параметры NLS,  которые явно  определяют специфические  элементы
        данных, необходимые для однозначной интерпретации формата  числа
        или даты.  NLS_DATE_FORMAT также не принимается как параметр, по
        причине, объясняемой ниже.

        Если для функции TO_CHAR, TO_NUMBER или TO_DATE  специфицируется
        параметр  NLS,  то  вторым  параметром  этой функции должна быть
        задана явная  маска формата.   Например, следующая  спецификация
        законна:

        TO_CHAR (hiredate, 'DD/MON/YY', 'nls_date_language = French')

        Однако следующие спецификации недопустимы:

        TO_CHAR (hiredate, 'nls_date_language = French')
        TO_CHAR (hiredate, 'nls_date_language = French', 'DD/MON/YY')

        Из этого  ограничения вытекает,  что задание  параметра NLS  для
        функции TO_CHAR  или TO_DATE  требует обязательной  спецификации
        явного  формата   даты.   Как   следствие,  NLS_DATE_FORMAT   не
        допускается как параметр для этих функций.





































                                      Поддержка национальных языков  E-7


Функция CONVERT
---------------

        Функция  SQL   CONVERT  позволяет   осуществлять  преобразования
        символьных данных  из одного  набора символов  в другой.  Полное
        описание этой функции можно найти в документе ORACLE7 Server SQL
        Language Reference Manual.

        Функция  CONVERT   преобразует  двоичное   представление  строки
        символов из одного набора  символов в другой.  Она  использует в
        точности  ту  же  технику,  которая  применяется  для прозрачных
        преобразований между наборами символов базы данных и клиента,  о
        которых говорилось выше.  Следовательно, эта функция  использует
        символы замещения, и на нее распространяются те же  ограничения.
        Синтаксис функции CONVERT имеет следующий вид:

-- CONVERT ( char --T-------------------------------------T--- ) ---
                      L- dest_char_set -T------------------T-
                                        L- , src_char_set---

        Здесь  char  -  преобразуемая  строка  символов,  src_char_set -
        исходный, а dest_char_set - целевой набор символов.


Функция NLSSORT
---------------

        Функция  NLSSORT  возвращает  для  строки символов эквивалентную
        строку  сортировки,  применяющуюся  в  механизме лингвистической
        сортировки.  Для двоичной (BINARY) сортировки, строка сортировки
        всегда совпадает со входной строкой.

        Механизм  лингвистической  сортировки  работает  путем замещения
        каждой сортируемой строки  символов некоторой двоичной  строкой,
        выбираемой   так,   чтобы   достичь   желательной сопоставляющей
        последовательности      сортировки.       Когда     используется
        лингвистическая сортировка, функция NLSSORT возвращает  двоичные
        значения, используемые для замещения исходных строк.


Сравнения строк в фразе WHERE

        NLSSORT  позволяет  приложениям  выполнять  сравнения  строк   в
        соответствии с соглашениями национального языка.  Обычно, строки
        символов сравниваются в фразе WHERE через их двоичные  значения.
        Один символ  "больше" другого,  если он  имеет большее  двоичное
        значение   в   наборе    символов   базы   данных.     Поскольку
        упорядоченность  символов  по  их  двоичным  значениям  может не
        соответствовать  алфавитной  упорядоченности,  такие   сравнения
        часто нарушают соглашения языка.   Например, буква "A умляут"  в
        немецком языке имеет двоичное представление "старше", чем  буква
        Z, однако в алфавитном порядке она должна располагаться между  A
        и B; в шведском языке эта же буква должна сортироваться после Z.

        Функция   NLSSORT   позволяет    обеспечить   в   фразе    WHERE
        лигнвистические   сравнения,   путем   использования  следующего
        синтаксиса:

        WHERE NLSSORT(<столбец>) <оператор> NLSSORT(сравниваемая строка)




E-8  Руководство разработчика приложений


        Заметьте,  что  функция  NLSSORT  должна  применяться  на  обеих
        сторонах оператора сравнения.  Например:

        SELECT COL1 FROM TAB1 WHERE NLSSORT(COL1) > NLSSORT('B')


Управление фразой ORDER BY

        Если используется лингвистическая сортировка, то функция NLSSORT
        неявно  применяется  к  каждому  символьному  элементу,  который
        специфицирован  в  фразе  ORDER  BY.  Как  следствие,   механизм
        сортировки  (лингвистической  или  двоичной), использующейся для
        ORDER BY, остается прозрачным для приложения.

        Однако,   если   функция   NLSSORT   явно   специфицирована  для
        символьного  элемента  в  фразе  ORDER  BY,  то  неявная функция
        NLSSORT  не  используется.   Иными  словами,  языковое замещение
        NLSSORT применяется лишь один раз, но не дважды.

        Явная функция NLSSORT обычно не нужна в фразе ORDER BY, если  по
        умолчанию применяется лингвистическая сортировка.  (Умалчиваемая
        сортировка  определяется  параметром  инициализации   NLS_SORT).
        Однако,  если  по   умолчанию  используется  механизм   двоичной
        сортировки (BINARY), то запрос, подобный следующему:

        SELECT ENAME FROM EMP
        ORDER BY ENAME

        будет  использовать   двоичную  сортировку.    Чтобы  обеспечить
        лингвистическую  сортировку,  скажем,  German,  исправьте   этот
        запрос следующим образом:

        SELECT ENAME FROM EMP
        ORDER BY NLSSORT(ENAME, 'NLS_SORT = 'GERMAN')