ПРИЛОЖЕНИЕ C ---------------------------------------------------------------- ПОДДЕРЖКА НАЦИОНАЛЬНЫХ ЯЗЫКОВ Это приложение описывает возможности администратора базы данных по управлению средствами, которые позволяют приложениям ORACLE работать с различными языками, используя соглашения, заданные пользователем приложения. Темы этой главы включают обсуждение следующих вопросов: * спецификация зависящего от языка поведения сессии * спецификация умалчиваемого зависящего от языка поведения * перекрытие стандартных умолчаний * форматы дат и чисел Поддержка национальных языков C-1 ---------------- Специфицирование наборов символов После того, как база данных создана, ее набор символов не может быть изменен без пересоздания базы данных. Следовательно, важно тщательно определить, какой набор символов будет использоваться в базе данных. Этот набор символов должен всегда быть надмножеством набора символов, присущего операционной системе. Наборы символов, используемые приложениями клиентов, работающими с базой данных, обычно помогают определить, какое надмножество является лучшим выбором. Если все приложения клиентов используют один и тот же набор символов, то естественно выбрать этот набор символов для базы данных. Если приложения клиентов используют различные наборы символов, то набор символов базы данных должен быть надмножеством всех этих наборов символов (или их объединением). Это гарантирует, что любой символ сможет быть представлен при преобразовании из набора символов клиента в набор символов базы данных. Преобразование набора символов ------------------------------ Для конкретных символов в рамках определения набора символов могут быть определены заменяющие символы. Там, где заменяющий символ не определен, будут использоваться умалчиваемые символы замены. Чтобы избежать замены символов при преобразовании из набора символов клиента в набор символов базы данных, выбирайте последний как надмножество всех наборов символов клиентов. C-2 Руководство администратора ---------------- Спецификация зависящего от языка поведения сессии Эта секция обсуждает параметры NLS, которые определяют операции приложений, зависящие от языка. Параметр NLS_LANG ----------------- Параметр NLS_LANG имеет три компоненты (язык, территория и набор символов), и задается в следующей форме: NLS_LANG = язык_территория.наборсимволов Каждая компонента контролирует операции определенного подмножества средств NLS. ЯЗЫК специфицирует такие соглашения, как язык, используемый для сообщений ORACLE, названий дней и месяцев. Каждый поддерживаемый язык имеет уникальное имя, например, American, French или German. Аргумент "язык" специфицирует умалчиваемые значения для аргументов "территория" и "набор символов", так что любой из этих аргументов (или оба) могут быть опущены. ТЕРРИТОРИЯ специфицирует такие соглашения, как умалчиваемый формат даты и десятичный разделитель для чисел. Каждая поддерживаемая территория имеет уникальное имя, например, America, France, Canada. НАБОР СИМВОЛОВ специфицирует набор символов, используемый приложением клиента (обычно это набор символов, присущий терминалу пользователя). Каждый поддерживаемый набор символов имеет уникальное сокращенное наименование, например, US7ASCII, WEISO8859P1, WE8DEC, WE8EBCDIC500, JA16EUC. Каждый язык имеет умалчиваемый набор символов, ассоциированный с этим языком. Умалчиваемые значения для языков, доступных на вашей системе, приведены в вашем руководстве по инсталляции [IUG]. Три аргумента параметра NLS_LANG могут быть специфицированы в любой комбинации, например: AMERICAN_AMERICA.US7ASCII FRENCH_FRANCE.ISO8859P1 FRENCH_CANADA.WE8DEC JAPANESE_JAPAN.JA16EUC Специфицирование NLS_LANG Параметр NLS_LANG определяется для каждой сессии через переменную окружения или эквивалентный специфичный для платформы механизм. Разные сессии, одновременно соединенные с одной и той же базой данных, могут специфицировать разные значения для своего параметра NLS_LANG. Поддержка национальных языков C-3 Каждая операционная система обрабатывает переменные окружения по-своему. Поэтому обратитесь к вашему руководству по инсталляции за указаниями о том, как устанавливать NLS_LANG в вашей системе. Например, на VMS вы могли бы специфицировать значение NLS_LANG, введя следующую строку в командной строке операционной системы: $ DEFINE NLS_LANG FRENCH_CANADA.WE8DEC Архитектура клиент-сервер ------------------------- NLS_LANG устанавливает окружение NLS, которое используется базой данных как для сессии сервера, так и для приложения клиента. Использование одного параметра гарантирует, что языковые окружения как базы данных, так и приложения будут автоматически одинаковыми. Умалчиваемый набор символов Умалчиваемые значения для ЯЗЫКА и ТЕРРИТОРИИ могут быть специфицированы для инстанции при ее запуске через параметры инициализации NLS_LANGUAGE и NLS_TERRITORY. Эти два параметра обсуждаются в следующей секции. Обратитесь к вашему руководству по инсталляции за перечнем стандартных умолчаний в вашей системе. Перекрытие спецификаций языка и территории Умалчиваемые значения для языка и территории могут перекрываться для сессии с помощью предложения ALTER SESSION. Например: ALTER SESSION SET NLS_LANGUAGE = FRENCH NLS_TERRITORY = FRANCE Это средство неявно используется, чтобы определить языковое окружение базы данных для каждой сессии. Предложение ALTER SESSION автоматически выполняется при соединении сессии с базой данных, и устанавливает значения NLS_LANGUAGE и NLS_TERRITORY из соответствующих аргументов переменной NLS_LANG. Если NLS_LANG не определена, то предложение ALTER SESSION не выдается. Когда переменная NLS_LANG определена, неявное предложение ALTER SESSION выполняется для всех инстанций, к которым подключается сессия, как для прямых, так и для косвенных соединений. Если во время сессии параметры NLS изменяются посредством явного предложения ALTER SESSION, то эти изменения распространяются на все инстанции, с которыми соединена данная сессия. C-4 Руководство администратора ---------------- Задание умалчиваемого языкового поведения Эта секция описывает параметры инициализации NLS_LANGUAGE и NLS_TERRITORY, которые специфицируют умалчиваемое языковое поведение любой сессии. Параметр NLS_LANGUAGE --------------------- Параметр NLS_LANGUAGE специфицирует умалчиваемые соглашения, определяющие следующие характеристики сессии: * язык, используемый для сообщений сервера * язык, используемый для имен дней и месяцев и для их сокращений (специфицируемых в функциях SQL TO_CHAR и TO_DATE) * символы, используемые в качестве эквивалентов индикаторов полудня (AM, PM) и эры (AD, BC) * умалчиваемую последовательность сортировки, используемую для символьных данных, когда специфицирована фраза ORDER BY (GROUP BY использует двоичную сортировку, если одновременно на задана фраза ORDER BY) Значение, заданное для параметра NLS_LANGUAGE в файлк параметров инициализации, определяет эти умолчания для всех сессий в данной инстанции. Обратитесь к вашему руководству по инсталляции, чтобы проверить, какие языковые соглашения поддерживаются для вашей платформы. Например, чтобы специфицировать умалчиваемый язык сессии как французский, этот параметр должен быть установлен следующим образом: NLS_LANGUAGE = FRENCH В этом случае, сообщение сервера ORA-00942: table or view does not exist появится в следующем виде: ORA-00942: table ou vue n'existe pas Сообщения, выдываемые сервером, хранятся в файлах двоичного формата, которые размещаются в каталоге ora_rdbms или его эквиваленте. (Обратитесь к вашему руководству по инсталляции за сведениями о местоположении этих файлов в вашей системе.) Могут существовать множественные версии этих файлов, по одной для каждого поддерживаемого языка. Имена этих файлов формируются по следующему соглашению: <продукт><язык>.MSB Например, файл, содержащий сообщения сервера на французском языке, имеет имя ORAF.MSB, где 'F' представляет собой обозначение, используемое для языка French. Сообщения в этих файлах записаны в одном специфическом наборе символов, который зависит от конкретного типа машины и операционной системы. Если этот набор символов отличен от набора символов базы данных, текст сообщений автоматически преобразуется в набор символов базы данных. Если необходимо, он будет далее преобразован в набор символов клиента, если он Поддержка национальных языков C-5 отличен от набора символов базы данных. Следовательно, сообщения будут корректно выдаваться на терминале клиента, в пределах ограничений, которые определены для преобразований между наборами символов. Умалчиваемое значение параметра NLS_LANGUAGE может зависеть от операционной системы. Оно указано в вашем руководстве по инсталляции [IUG]. Вы можете изменить это значение, отредактировав ваш файл инициализации и перезапустив инстанцию. Параметр NLS_TERRITORY ---------------------- Параметр NLS_TERRITORY специфицирует соглашения, которые определяют следующие умалчиваемые характеристики форматирования чисел и дат: * формат даты * десятичный разделитель и разделитель групп * местный символ валюты * международный символ валюты (стандарт ISO) * начальный день недели Значение, заданное для NLS_TERRITORY в файле инициализации, определяет эти умолчания для инстанции. Например, чтобы специфицировать умалчиваемую территорию как Францию, вы должны установить этот параметр следующим образом: NLS_TERRITORY = FRANCE В этом случае числа будут форматироваться с использованием запятой в качестве десятичного разделителя. Умалчиваемое значение параметра NLS_TERRITORY может зависеть от операционной системы. Оно указано в вашем руководстве по инсталляции [IUG]. Вы можете изменить это значение, отредактировав ваш файл инициализации и перезапустив инстанцию. C-6 Руководство администратора ---------------- Перекрытие стандартных умолчаний Параметры NLS_LANGUAGE и NLS_TERRITORY неявно определяют несколько аспектов зависящих от языка операций. Существуют дополнительные параметры, которые обеспечивают вам явный контроль над этими аспектами. Параметры, перечисленные ниже, могут задаваться как в файле инициализации, так и специфицироваться для индивидуальной сессии с помощью команды ALTER SESSION. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) Существуют следующие дополнительные параметры NLS: Параметр NLS_DATE_FORMAT умалчиваемый формат даты NLS_DATE_LANGUAGE умалчиваемый язык для дат NLS_NUMERIC_CHARACTERS десятичный и групповой разделители NLS_CURRENCY местный символ валюты NLS_ISO_CURRENCY международный символ валюты NLS_SORT последовательность сортировки Эти параметры описаны в следующих секциях. Параметр NLS_DATE_FORMAT ------------------------ Этот параметр специфицирует умалчиваемый формат даты, перекрывая формат, определенный неявно через параметр NLS_TERRITORY. Значением параметра NLS_DATE_FORMAT может быть любой формат, воспринимаемый функцией TO_DATE. Например, чтобы умалчиваемый формат даты выдавал номера месяцев римскими цифрами, вы можете включить в ваш файл инициализации следующую строку: NLS_DATE_FORMAT = 'DD RM YY' При таком умалчиваемом формате даты, следующее предложение SELECT возвратит показанное ниже значение (принимая, что текущей датой является 13 февраля 1991): SELECT TO_CHAR(SYSDATE) CURRDATE FROM DUAL; CURRDATE --------- 13 II 91 Замечание: При проектировании приложений может потребоваться учитывать возможность переменной длины для умалчиваемого формата даты. Вы можете изменить умалчиваемое значение NLS_DATE_FORMAT, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER Поддержка национальных языков C-7 SESSION SET NLS_DATE_FORMAT. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) Параметр NLS_DATE_LANGUAGE -------------------------- Этот параметр специфицирует язык, используемый для названий дней и месяцев в функциях TO_CHAR и TO_DATE, перекрывая язык, определенный неявно через параметр NLS_LANGUAGE. Параметр NLS_DATE_LANGUAGE имеет такой же синтаксис, что и параметр NLS_LANGUAGE, и его допустимыми значениями являются все поддерживаемые языки. Например, чтобы специфицировать язык дат как французский, вы можете включить в ваш файл инициализации следующую строку: NLS_DATE_LANGUAGE = FRENCH В этом случае запрос SELECT TO_CHAR(SYSDATE, 'Day:Dd Month yyyy') возвратит следующий результат: Mercredi:13 Fevrier 1991 Сокращенные названия дней и месяцев также определяются этим параметром, например: Me:13 Fev 1991 Умалчиваемый формат даты также подчиняется соглашениям текущего языка дат. Например, если умалчиваемый формат даты определен как DD-MON-YYYY, то при вставке значений вы должны, в данном случае, использовать французские сокращения месяцев, например: INSERT INTO имя_таблицы VALUES ('13-FEV-1991'); Сокращения для AM (до полудня), PM (после полудня), AD (нашей эры) и BC (до нашей эры) также используют язык, определяемый параметром NLS_DATE_LANGUAGE. Заметим, однако, что числительные, возвращаемые функцией TO_CHAR, всегда используют английский язык. Например, запрос SELECT TO_CHAR(TO_DATE('27-Fev-91'), 'Day: ddspth Month') FROM DUAL; возвратит: Mercredi: twenty-seventh Fevrier Вы можете изменить умалчиваемое значение NLS_DATE_LANGUAGE, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER SESSION SET NLS_DATE_LANGUAGE. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) C-8 Руководство администратора Параметр NLS_NUMERIC_CHARACTERS ------------------------------- Этот параметр задает десятичный и групповой разделители, перекрывая те, которые были неявно определены параметром NLS_TERRITORY. Десятичный разделитель отделяет целую часть числа от дробной. Групповой разделитель - это символ, возвращаемый маской формата G; он отделяет тысячи, миллионы и т.п. Например, чтобы задать в качестве десятичного разделителя запятую, а группового - точку, вы можете включить в ваш файл инициализации следующую строку: NLS_NUMERIC_CHARACTERS = ',.' Оба разделителя должны быть одиночными символами и должны отличаться друг от друга. Любой из них может быть пробелом. [!] Замечание: Если десятичный разделитель отличен от точки, или если используется групповой разделитель, то числа, которые появляются в предложениях SQL, должны заключаться в апострофы, так как запятая обычно используется как разделитель элементов в списках. Например: INSERT INTO SIZES (ITEMID, WIDTH, QUANTITY) VALUES (618, '45,5', TO_NUMBER('1.234', '9G999')); Вы можете изменить умалчиваемое значение NLS_NUMERIC_CHARACTERS, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER SESSION SET NLS_NUMERIC_CHARACTERS. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) Параметр NLS_CURRENCY --------------------- Этот параметр специфицирует строку символов, возвращаемую числовой маской формата L и обозначающую местный символ валюты, перекрывая соответствующее значение, определенное неявно параметром NLS_TERRITORY. Например, чтобы установить местный символ валюты как 'Dfl ' (включая хвостовой пробел), вы можете включить в ваш файл инициализации следующую строку: NLS_CURRENCY = 'Dfl ' В этом случае запрос SELECT TO_CHAR(TOTAL, 'L099G999D99') "TOTAL" FROM ORDERS WHERE CUSTNO = 586 возвратит: TOTAL ------------- Dfl 12.673,49 Вы можете изменить умалчиваемое значение NLS_CURRENCY, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER Поддержка национальных языков C-9 SESSION SET NLS_CURRENCY. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) Параметр NLS_ISO_CURRENCY ------------------------- Этот параметр специфицирует строку символов, возвращаемую числовой маской формата C и обозначающую международный символ валюты, перекрывая соответствующее значение, определенное неявно параметром NLS_TERRITORY. Местные обозначения валюты могут быть двусмысленными; например, знак доллара ($) может обозначать как американские, так и австралийские доллары. Стандарт ISO 4127 1987-07-15 определяет уникальные международные обозначения валют для конкретных территорий или государств. Так, американский доллар имеет стандартное обозначение USD, австралийский - AUD. Для определения того, какое обозначение ISO использовать, принимается в расчет текущая территория. Параметр NLS_ISO_CURRENCY имеет такой же синтаксис, что и параметр NLS_TERRITORY, и его допустимыми значениями являются все поддерживаемые территории. Например, чтобы установить международный символ валюты для Франции, вы можете включить в ваш файл инициализации следующую строку: NLS_ISO_CURRENCY = FRANCE В этом случае запрос SELECT TO_CHAR(TOTAL, 'C099G999D99') "TOTAL" FROM ORDERS WHERE CUSTNO = 586 возвратит: TOTAL ------------- FRF12.673,49 Вы можете изменить умалчиваемое значение NLS_ISO_CURRENCY, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER SESSION SET NLS_ISO_CURRENCY. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) C-10 Руководство администратора Параметр NLS_SORT ----------------- Этот параметр специфицирует тип сортировки, используемой для символьных данных, перекрывая соответствующее значение, определенное неявно параметром NLS_LANGUAGE. Синтаксис параметра NLS_SORT имеет следующий вид: NLS_SORT = { BINARY | имя } BINARY специфицирует двоичную сортировку, а "имя" специфицирует конкретную лингвистическую сортировку. Например, чтобы специфицировать лингвистическую сортировку с именем German, вы можете включить в ваш файл инициализации следующую строку: NLS_SORT = German Имя лингвистической сортировки не имеет прямого отношения к именам языков. В большинстве случаев, однако, для каждого поддерживаемого языка определена соответствующая лингвистическая сортировка, которая имеет такое же имя. Обратитесь к вашему руководству по инсталляции, чтобы проверить, какие лингвистические сортировки поддерживаются для вашей платформы. Вы можете изменить умалчиваемое значение NLS_SORT, отредактировав файл инициализации и перезапустив инстанцию, либо изменить это значение для текущей сессии с помощью команды ALTER SESSION SET NLS_SORT. (Обратитесь к документу ORACLE7 Server SQL Language Reference Manual за полным описанием предложения ALTER SESSION.) ---------------- Форматы чисел и дат Для функций TO_CHAR, TO_DATE и TO_NUMBER предоставляются несколько масок формата, чтобы форматировать даты и числа в соответствии с действующими соглашениями. Замечание: Функция 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. Поддержка национальных языков C-11 Для поддержки стандарта 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.