22.1. Поддержка локали#
22.1. Поддержка локали #
Поддержка локали означает, что приложение учитывает культурные предпочтения, касающиеся алфавитов, сортировки, форматирования чисел и т. д. Tantor BE использует стандартные средства локали ISO C и POSIX, предоставляемые операционной системой сервера. Дополнительную информацию см. в документации вашей системы.
22.1.1. Обзор #
Поддержка локали автоматически инициализируется при создании кластера базы данных с помощью команды initdb
.
initdb
инициализирует кластер базы данных с настройкой локали по умолчанию, соответствующей окружению выполнения. Если ваша система уже настроена на использование локали, которую нужно использовать в кластере базы данных, то вам не нужно выполнять никаких дополнительных действий. Если нужно использовать другую локаль (или не уверены, какая локаль установлена на вашей системе), вы можете указать initdb
конкретную локаль, используя опцию --locale
. Например:
initdb --locale=sv_SE
Этот пример для систем Unix устанавливает локаль на шведский язык
(sv
), как он говорится
в Швеции (SE
). Другие возможности могут включать
en_US
(американский английский) и fr_CA
(французский
канадский). Если для локали может использоваться более одной кодировки,
то спецификации могут иметь вид
language_territory.codeset
. Например,
fr_BE.UTF-8
представляет французский язык (fr) как
он говорится в Бельгии (BE), с кодировкой символов UTF-8.
Какие локали доступны на вашей системе и под какими именами они доступны зависит от того, что было предоставлено поставщиком операционной системы и что было установлено. На большинстве Unix-систем команда locale -a
предоставит список доступных локалей. В Windows используются более подробные имена локалей, такие как German_Germany
или Swedish_Sweden.1252
, но принципы остаются теми же.
Иногда полезно смешивать правила из нескольких локалей, например, использовать правила сортировки на английском языке, но испанские сообщения. Для поддержки этого существует набор подкатегорий локалей, которые контролируют только определенные аспекты правил локализации:
LC_COLLATE | Порядок сортировки строк |
LC_CTYPE | Классификация символов (Что такое буква? Ее прописной эквивалент?) |
LC_MESSAGES | Язык сообщений |
LC_MONETARY | Форматирование денежных сумм |
LC_NUMERIC | Форматирование чисел |
LC_TIME | Форматирование дат и времени |
Имена категорий переводятся на имена параметров initdb
для переопределения выбора локали для конкретной категории. Например, чтобы установить локаль на французскую канадскую, но использовать правила США для форматирования валюты, используйте initdb --locale=fr_CA --lc-monetary=en_US
.
Если нужно, чтобы система вела себя так, как если бы у нее не было поддержки локали, используйте специальное имя локали C
, или эквивалентно POSIX
.
В некоторых локальных категориях значения должны быть зафиксированы при создании базы данных. Вы можете использовать разные настройки для разных баз данных, но после создания базы данных вы больше не сможете изменить их для этой базы данных. LC_COLLATE
и LC_CTYPE
- это такие категории. Они влияют на порядок отображения индексов, поэтому они должны быть зафиксированы, иначе индексы на текстовых столбцах могут быть повреждены. (Но вы можете смягчить это ограничение, используя правила сортировки, как описано в разделе Раздел 22.2). Значения по умолчанию для этих категорий определяются при запуске команды initdb
, и эти значения используются при создании новых баз данных, если они не указаны иначе в команде CREATE DATABASE
.
Другие категории локали могут быть изменены по желанию путем установки параметров конфигурации сервера, с теми же именами, что и категории локали (см. Раздел 18.11.2 для получения подробной информации). Значения, выбранные initdb
, фактически записываются только в файл конфигурации postgresql.conf
для использования в качестве значений по умолчанию при запуске сервера. Если вы удалите эти назначения из файла postgresql.conf
, то сервер унаследует настройки из своего окружения выполнения.
Обратите внимание, что локализация сервера определяется переменными среды, видимыми сервером, а не средой любого клиента. Поэтому будьте внимательны при настройке правильных параметров локали перед запуском сервера. В результате этого, если клиент и сервер настроены на разные локали, сообщения могут отображаться на разных языках в зависимости от их происхождения.
Примечание
Когда мы говорим о наследовании локали из окружения выполнения, это означает следующее на большинстве операционных систем:
Для заданной категории локали, скажем, правило сортировки, следующие переменные окружения проверяются в следующем порядке, пока не будет найдена установленная переменная: LC_ALL
, LC_COLLATE
(или переменная, соответствующая соответствующей категории), LANG
. Если ни одна из этих переменных окружения не установлена, то локаль по умолчанию будет C
.
Некоторые библиотеки локализации сообщений также обращают внимание на переменную окружения LANGUAGE
, которая переопределяет все другие настройки локали для установки языка сообщений. Если возникают сомнения, пожалуйста, обратитесь к документации вашей операционной системы, в частности к документации о gettext.
Для того чтобы сообщения могли быть переведены на предпочитаемый пользователем язык, необходимо выбрать NLS при сборке (с помощью команды configure --enable-nls
). Все остальные функции локализации встроены автоматически.
22.1.2. Поведение #
Настройки локали влияют на следующие функции SQL:
Сортировка в запросах с использованием
ORDER BY
или стандартных операторов сравнения для текстовых данныхОператоры сопоставления шаблонов (
LIKE
,SIMILAR TO
и POSIX-стиль регулярных выражений); локали влияют как на регистронезависимое сопоставление, так и на классификацию символов с помощью регулярных выражений, основанных на классах символовВозможность использования индексов с операторами
LIKE
Недостатком использования локалей, отличных от C
или
POSIX
в Tantor BE, является его влияние на производительность.
Он замедляет обработку символов и не позволяет использовать обычные индексы
с оператором LIKE
. Поэтому используйте локали
только в случае реальной необходимости.
В качестве обходного решения, чтобы Tantor BE мог использовать индексы с предложениями LIKE
вне локали C, существуют несколько пользовательских классов операторов. Они позволяют создавать индекс, выполняющий строгое сравнение символа за символом, игнорируя правила сравнения локали. Дополнительную информацию см. в разделе Раздел 11.10. Другой подход - создание индексов с использованием правила сортировки C
, описанной в разделе Раздел 22.2.
22.1.3. Выбор локалей #
Локали могут быть выбраны в различных областях в зависимости от требований.
Вышеуказанный обзор показал, как локали указываются с помощью команды initdb
для установки значений по умолчанию для всего кластера. В следующем списке показаны места, где можно выбрать локали. Каждый элемент предоставляет значения по умолчанию для последующих элементов, и каждый нижестоящий элемент позволяет переопределить значения по умолчанию с более точной гранулярностью.
Как уже объяснялось выше, окружение операционной системы предоставляет значения по умолчанию для локалей в новоинициализированном кластере базы данных. Во многих случаях этого достаточно: если операционная система настроена на нужный язык/территорию, то Tantor BE по умолчанию также будет работать в соответствии с этой локалью.
Как показано выше, параметры командной строки для
initdb
определяют настройки локали для новоинициализированного кластера базы данных. Используйте это, если операционная система не имеет нужной конфигурации локали для вашей базы данных.Локаль может быть выбрана отдельно для каждой базы данных. SQL-команда
CREATE DATABASE
и ее эквивалент в командной строкеcreatedb
имеют соответствующие опции. Используйте это, например, если кластер баз данных содержит базы данных для нескольких арендаторов с разными требованиями.Возможно установить настройки локали для отдельных столбцов таблицы. Для этого используется SQL-объект, называемый collation, и это объясняется в разделе Раздел 22.2. Используйте это, например, для сортировки данных на разных языках или настройки порядка сортировки для конкретной таблицы.
Наконец, локали могут быть выбраны для отдельного запроса. Опять же, это использует объекты правила сортировки SQL. Это может быть использовано для изменения порядка сортировки на основе выбора во время выполнения или для импровизированного эксперимента.
22.1.4. Поставщики локализации #
Tantor BE поддерживает несколько поставщиков локали. Это определяет, какая библиотека предоставляет данные о локали. Одним из стандартных поставщиков является libc
, который использует локали, предоставляемые операционной системой через библиотеку C. Это локали, используемые большинством инструментов, предоставляемых операционной системой. Другим поставщиком является icu
, который использует внешнюю библиотеку ICU.
библиотека. Локали ICU могут быть использованы только в том случае, если поддержка ICU была настроена при сборке PostgreSQL.
Команды и инструменты, которые выбирают настройки локали, как описано выше, имеют опцию для выбора поставщика локали. Приведенные ранее примеры все используют поставщика libc
, который является значением по умолчанию. Вот пример инициализации кластера базы данных с использованием поставщика ICU:
initdb --locale-provider=icu --icu-locale=en
Смотрите описание соответствующих команд и программ для получения
подробностей. Обратите внимание, что вы можете смешивать провайдеров локали на разных
уровнях детализации, например, использовать libc
по умолчанию для
кластера, но иметь одну базу данных, которая использует провайдер icu
,
а затем иметь объекты правил сортировки, использующие любого из этих провайдеров внутри
этих баз данных.
Какой поставщик локали использовать зависит от индивидуальных требований. Для большинства базовых случаев любой из поставщиков даст достаточные результаты. Для поставщика libc это зависит от того, что предлагает операционная система; некоторые операционные системы лучше других. Для продвинутых случаев ICU предлагает больше вариантов локали и настраиваемых параметров.
22.1.5. Локали ICU #
22.1.5.1. Названия локалей ICU #
Формат ICU для имени локали — это Языковой Тег.
CREATE COLLATION mycollation1 (provider = icu, locale = 'ja-JP'); CREATE COLLATION mycollation2 (provider = icu, locale = 'fr');
22.1.5.2. Канонизация и валидация локали #
При определении нового правила сортировки ICU или базы данных с ICU в качестве поставщика, заданное имя локали преобразуется ("канонизируется") в языковой тег, если оно еще не в этой форме. Например,
CREATE COLLATION mycollation3 (provider = icu, locale = 'en-US-u-kn-true'); NOTICE: using standard form "en-US-u-kn" for locale "en-US-u-kn-true" CREATE COLLATION mycollation4 (provider = icu, locale = 'de_DE.utf8'); NOTICE: using standard form "de-DE" for locale "de_DE.utf8"
Если вы видите это уведомление, убедитесь, что поставщик
и
локаль
соответствуют ожидаемому результату. Для получения
стабильных результатов при использовании поставщика ICU указывайте канонический языковой тег вместо того, чтобы полагаться на
преобразование.
Локаль без имени языка или специальное имя языка
root
, преобразуется так, чтобы иметь язык
und
("неопределенный").
ICU может преобразовывать большинство имен локалей libc, а также некоторые другие форматы, в языковые теги для облегчения перехода на ICU. Если имя локали libc используется в ICU, оно может не иметь точно такого же поведения, как в libc.
Если возникает проблема с интерпретацией имени локали или если имя локали представляет язык или регион, который ICU не распознает, вы увидите следующее предупреждение:
CREATE COLLATION nonsense (provider = icu, locale = 'nonsense'); WARNING: ICU locale "nonsense" has unknown language "nonsense" HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. CREATE COLLATION
icu_validation_level управляет тем, как сообщение
будет сообщено. Если не установлено значение ERROR
, то
правило сортировки все равно будет создано, но поведение может не соответствовать ожиданиям пользователя.
22.1.5.3. Языковой Тег #
Языковой тег, определенный в BCP 47, является стандартизированным идентификатором, используемым для идентификации языков, регионов и другой информации о локали.
Основные языковые теги просто
language
-
region
;
или даже просто language
.
language
— это код языка
(например, fr
для французского), а
region
— это код региона
(например, CA
для Канады). Примеры:
ja-JP
, de
или
fr-CA
.
Настройки сортировки могут быть включены в языковой тег для настройки поведения сортировки. ICU позволяет обширную настройку, такую как чувствительность (или нечувствительность) к акцентам, регистру и пунктуации; обработка цифр в тексте; и многие другие опции для удовлетворения различных потребностей.
Чтобы включить эту дополнительную информацию о правиле сортировки в языковой тег,
добавьте -u
, что указывает на наличие дополнительных
настроек сортировки, за которым следует одна или несколько пар
-
key
-
value
.
key
является ключом для настройки сортировки, а
value
является допустимым значением для этой настройки. Для
логических настроек -
key
может быть указан без соответствующего
-
value
, что подразумевает
значение true
.
Например, языковой тег en-US-u-kn-ks-level2
означает локаль с английским языком в регионе США, с
настройками сортировки kn
установленными на true
и ks
установленными на level2
. Эти
настройки означают, что сортировка будет нечувствительной к регистру и будет рассматривать последовательность
цифр как одно число:
CREATE COLLATION mycollation5 (provider = icu, deterministic = false, locale = 'en-US-u-kn-ks-level2'); SELECT 'aB' = 'Ab' COLLATE mycollation5 as result; result -------- t (1 row) SELECT 'N-45' < 'N-123' COLLATE mycollation5 as result; result -------- t (1 row)
См. Раздел 22.2.3 для получения подробной информации и дополнительных примеров использования языковых тегов с пользовательской информацией о правиле сортировки для локали.
22.1.6. Проблемы #
Если поддержка локали не работает в соответствии с объяснением выше,
проверьте, что поддержка локали в вашей операционной системе
настроена правильно. Чтобы проверить, какие локали установлены в вашей
системе, вы можете использовать команду locale -a
, если
ваша операционная система предоставляет ее.
Проверьте, что Tantor BE действительно использует локаль, которую вы думаете. Настройки LC_COLLATE
и LC_CTYPE
определяются при создании базы данных и не могут быть изменены, кроме как путем создания новой базы данных. Другие настройки локали, включая LC_MESSAGES
и LC_MONETARY
, изначально определяются окружением, в котором запущен сервер, но могут быть изменены "на лету". Вы можете проверить активные настройки локали с помощью команды SHOW
.
Каталог src/test/locale
в исходном
дистрибутиве содержит набор тестов для
поддержки локализации Tantor BE.
Клиентские приложения, которые обрабатывают ошибки на стороне сервера, разбирая текст сообщения об ошибке, очевидно, столкнутся с проблемами, когда сообщения сервера находятся на другом языке. Авторам таких приложений рекомендуется использовать схему кодов ошибок вместо этого.
Поддержка каталогов переводов сообщений требует постоянных усилий множества добровольцев, которые хотят, чтобы Tantor BE говорил на их предпочитаемом языке хорошо. Если сообщения на вашем языке в настоящее время недоступны или не полностью переведены, ваша помощь будет оценена. Если нужно помочь, обратитесь к Глава 54 или напишите на список рассылки разработчиков.