23.1. Поддержка локали#

23.1. Поддержка локали

23.1. Поддержка локали

Поддержка локали означает, что приложение учитывает культурные предпочтения, касающиеся алфавитов, сортировки, форматирования чисел и т. д. Tantor SE использует стандартные средства локали ISO C и POSIX, предоставляемые операционной системой сервера. Дополнительную информацию см. в документации вашей системы.

23.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 - это такие категории. Они влияют на порядок отображения индексов, поэтому они должны быть зафиксированы, иначе индексы на текстовых столбцах могут быть повреждены. (Но вы можете смягчить это ограничение, используя правила сортировки, как описано в разделе Раздел 23.2). Значения по умолчанию для этих категорий определяются при запуске команды initdb, и эти значения используются при создании новых баз данных, если они не указаны иначе в команде CREATE DATABASE.

Другие категории локали могут быть изменены по желанию путем установки параметров конфигурации сервера, с теми же именами, что и категории локали (см. Раздел 19.11.2 для получения подробной информации). Значения, выбранные initdb, фактически записываются только в файл конфигурации postgresql.conf для использования в качестве значений по умолчанию при запуске сервера. Если вы удалите эти назначения из файла postgresql.conf, то сервер унаследует настройки из своего окружения выполнения.

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

Примечание

Когда мы говорим о наследовании локали из окружения выполнения, это означает следующее на большинстве операционных систем: Для заданной категории локали, скажем, правило сортировки, следующие переменные окружения проверяются в следующем порядке, пока не будет найдена установленная переменная: LC_ALL, LC_COLLATE (или переменная, соответствующая соответствующей категории), LANG. Если ни одна из этих переменных окружения не установлена, то локаль по умолчанию будет C.

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

Для того чтобы сообщения могли быть переведены на предпочитаемый пользователем язык, необходимо выбрать NLS при сборке (с помощью команды configure --enable-nls). Все остальные функции локализации встроены автоматически.

23.1.2. Поведение

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

  • Сортировка в запросах с использованием ORDER BY или стандартных операторов сравнения для текстовых данных

  • Функции upper, lower и initcap

  • Операторы сопоставления шаблонов (LIKE, SIMILAR TO и POSIX-стиль регулярных выражений); локали влияют как на регистронезависимое сопоставление, так и на классификацию символов с помощью регулярных выражений, основанных на классах символов

  • Семейство функций to_char

  • Возможность использования индексов с операторами LIKE

Недостатком использования локалей, отличных от C или POSIX в Tantor SE, является его влияние на производительность. Он замедляет обработку символов и не позволяет использовать обычные индексы с оператором LIKE. Поэтому используйте локали только в случае реальной необходимости.

В качестве обходного решения, чтобы Tantor SE мог использовать индексы с предложениями LIKE вне локали C, существуют несколько пользовательских классов операторов. Они позволяют создавать индекс, выполняющий строгое сравнение символа за символом, игнорируя правила сравнения локали. Дополнительную информацию см. в разделе Раздел 11.10. Другой подход - создание индексов с использованием правила сортировки C, описанной в разделе Раздел 23.2.

23.1.3. Выбор локалей

Локали могут быть выбраны в различных областях в зависимости от требований. Вышеуказанный обзор показал, как локали указываются с помощью команды initdb для установки значений по умолчанию для всего кластера. В следующем списке показаны места, где можно выбрать локали. Каждый элемент предоставляет значения по умолчанию для последующих элементов, и каждый нижестоящий элемент позволяет переопределить значения по умолчанию с более точной гранулярностью.

  1. Как уже объяснялось выше, окружение операционной системы предоставляет значения по умолчанию для локалей в новоинициализированном кластере базы данных. Во многих случаях этого достаточно: если операционная система настроена на нужный язык/территорию, то Tantor SE по умолчанию также будет работать в соответствии с этой локалью.

  2. Как показано выше, параметры командной строки для initdb определяют настройки локали для новоинициализированного кластера базы данных. Используйте это, если операционная система не имеет нужной конфигурации локали для вашей базы данных.

  3. Локаль может быть выбрана отдельно для каждой базы данных. SQL-команда CREATE DATABASE и ее эквивалент в командной строке createdb имеют соответствующие опции. Используйте это, например, если кластер баз данных содержит базы данных для нескольких арендаторов с разными требованиями.

  4. Возможно установить настройки локали для отдельных столбцов таблицы. Для этого используется SQL-объект, называемый collation, и это объясняется в разделе Раздел 23.2. Используйте это, например, для сортировки данных на разных языках или настройки порядка сортировки для конкретной таблицы.

  5. Наконец, локали могут быть выбраны для отдельного запроса. Опять же, это использует объекты правила сортировки SQL. Это может быть использовано для изменения порядка сортировки на основе выбора во время выполнения или для импровизированного эксперимента.

23.1.4. Поставщики локализации

Tantor SE поддерживает несколько поставщиков локали. Это определяет, какая библиотека предоставляет данные о локали. Одним из стандартных поставщиков является libc, который использует локали, предоставляемые операционной системой через библиотеку C. Это локали, используемые большинством инструментов, предоставляемых операционной системой. Другим поставщиком является icu, который использует внешнюю библиотеку ICU. библиотека. Локали ICU могут быть использованы только в том случае, если поддержка ICU была настроена при сборке PostgreSQL.

Команды и инструменты, которые выбирают настройки локали, как описано выше, имеют опцию для выбора поставщика локали. Приведенные ранее примеры все используют поставщика libc, который является значением по умолчанию. Вот пример инициализации кластера базы данных с использованием поставщика ICU:

initdb --locale-provider=icu --icu-locale=en

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

Какой поставщик локали использовать зависит от индивидуальных требований. Для большинства базовых случаев любой из поставщиков даст достаточные результаты. Для поставщика libc это зависит от того, что предлагает операционная система; некоторые операционные системы лучше других. Для продвинутых случаев ICU предлагает больше вариантов локали и настраиваемых параметров.

23.1.5. Проблемы

Если поддержка локали не работает в соответствии с объяснением выше, проверьте, что поддержка локали в вашей операционной системе настроена правильно. Чтобы проверить, какие локали установлены в вашей системе, вы можете использовать команду locale -a, если ваша операционная система предоставляет ее.

Проверьте, что Tantor SE действительно использует локаль, которую вы думаете. Настройки LC_COLLATE и LC_CTYPE определяются при создании базы данных и не могут быть изменены, кроме как путем создания новой базы данных. Другие настройки локали, включая LC_MESSAGES и LC_MONETARY, изначально определяются окружением, в котором запущен сервер, но могут быть изменены "на лету". Вы можете проверить активные настройки локали с помощью команды SHOW.

Каталог src/test/locale в исходном дистрибутиве содержит набор тестов для поддержки локализации Tantor SE.

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

Поддержка каталогов переводов сообщений требует постоянных усилий множества добровольцев, которые хотят, чтобы Tantor SE говорил на их предпочитаемом языке хорошо. Если сообщения на вашем языке в настоящее время недоступны или не полностью переведены, ваша помощь будет оценена. Если нужно помочь, обратитесь к Глава 55 или напишите на список рассылки разработчиков.