Локализация
Локаль влияет на алфавит, порядок сортировки, форматирование чисел и т. пinitdb
инициализирует кластер баз данных по умолчанию с локалью из окружения выполнения, если нужно использовать другую то можно передать аргумент в initdb
initdb --locale=ru_RU
Если в языковом окружении может использоваться более одного набора символов, значение может принимать вид language_territory.codeset. Например, fr_BE.UTF-8 обозначает французский язык (fr), на котором говорят в Бельгии (BE), с кодировкой UTF-8
Иногда целесообразно объединить правила из различных локалей, например, использовать английские правила сравнения и испанские сообщения. Для этой цели существует набор категорий локали, каждая из которых управляет только определёнными аспектами правил локализации:
name | description |
---|---|
LC_COLLATE | Порядок сортировки строк |
LC_CTYPE | Классификация символов (Что представляет собой буква? Каков её эквивалент в верхнем регистре?) |
LC_MESSAGES | Язык сообщений |
LC_MONETARY | Форматирование валютных сумм |
LC_NUMERIC | Форматирование чисел |
LC_TIME | Форматирование даты и времени |
Пример использования в initdb
initdb --locale=fr_CA --lc-monetary=en_US
LC_COLLATE и LC_CTYPE нельзя изменить после создания базы так как они влияют на порядок сортировки в индексах (иначе индексы на текстовых столбцах могут повредиться)
Если же клиент и сервер работают с разными локалями, то сообщения, возможно, будут появляться на разных языках в зависимости от того, где они возникают
Для того чтобы стал возможен перевод сообщений на язык, выбранный пользователем, NLS (National Language Support) должен быть выбран на момент сборки (configure --enable-nls
)
Локаль влияет на следующий функционал SQL:
- Порядок сортировки в запросах с использованием
ORDER BY
или стандартных операторах сравнения текстовых данных - Функции
upper
,lower
, иinitcap
- Операторы поиска по шаблону (
LIKE
,SIMILAR TO
, и регулярные выражения в стиле POSIX) - Семейство функций
to_char
- Возможность использовать индексы с предложениями
LIKE
Недостатком использования отличающихся от C или POSIX локалей в PostgreSQL является влияние на производительность. Это замедляет обработку символов и мешает LIKE
использовать обычные индексы. По этой причине используйте локали только в том случае, если они действительно вам нужны
postgres=# select name, setting from pg_settings where name like 'lc_%';
name | setting
-------------+---------
lc_collate | C
lc_ctype | C
lc_messages | C
lc_monetary | C
lc_numeric | C
lc_time | C
(6 rows)
Правила сортировки позволяют устанавливать порядок сортировки и особенности классификации символов в отдельных столбцах или даже при выполнении отдельных операций. Это смягчает последствия того, что параметры базы данных LC_COLLATE
и LC_CTYPE
невозможно изменить после её создания
Про правила сортировки https://postgrespro.ru/docs/postgresql/14/collation
Еще одна страница которую я не понял https://postgrespro.ru/docs/postgresql/14/multibyte
No Comments