ПРИЛОЖЕНИЕ 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')