Как узнать, использует ли мой сервер PostgreSQL локаль «C»?

StackOverflow https://stackoverflow.com/questions/1665726

Вопрос

Я пытаюсь максимально оптимизировать свои таблицы БД PostgreSQL 8.3 и не уверен, нужно ли мне использовать varchar_pattern_ops для определенных столбцов, где я выполняю LIKE против первых N символов строки.В соответствии с эта документация, использование xxx_pattern_ops необходим только «...когда сервер не использует стандартную локаль «C».

Может кто-нибудь объяснить, что это значит?Как проверить, какую локаль использует моя база данных?

Это было полезно?

Решение

В настоящее время некоторые локали [документы] поддержка может быть установлена ​​только во время initdb, но я думаю, что она имеет отношение к _pattern_ops можно изменить через НАБОР во время выполнения LC_COLLATE.Чтобы увидеть установленные значения, вы можете использовать ПОКАЗЫВАТЬ команда.

Например:

SHOW LC_COLLATE

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

О чем локаль То есть, это набор правил порядка символов, форматирования и тому подобных вещей, которые варьируются от языка/страны к другому языку/стране.Например, локаль fr_CA (французский язык в Канаде) может иметь некоторые другие правила сортировки (или способ отображения чисел и т. д.), чем en_CA (английский язык в Канаде).Стандартная локаль «C» — это локаль по умолчанию, соответствующая стандартам POSIX.Допустимы только строгие символы ASCII, а правила упорядочивания и форматирования в основном соответствуют правилам en_US (американский английский).

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

Другие советы

psql -l

согласно справочнику

пример вывода:

                               List of databases
    Name     | Owner  | Encoding |   Collate   |    Ctype    | Access privileges
-------------+--------+----------+-------------+-------------+-------------------
 packrd      | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres    | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
             |        |          |             |             | packrd=CTc/packrd
 template1   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
             |        |          |             |             | packrd=CTc/packrd
(5 rows)

Существует и другой способ (при условии, что вы хотите их проверять, а не изменять):

Проверьте файл /var/lib/postgres/data/postgresql.conf Следующие строки следует найти:

# These settings are initialized by initdb, but they can be changed.
lc_messages = 'en_US.UTF-8'                     # locale for system error message strings
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting

Хорошо, судя по моим наблюдениям, эта первоначальная настройка

initdb --locale=xxx

 --locale=locale
       Specifies the locale to be used in this database. This is equivalent to specifying both --lc-collate and --lc-ctype.

в основном определяет локаль «по умолчанию» для всей базы данных, которую вы создаете после этого (т.е.он определяет настройки для шаблона template1, который является шаблоном по умолчанию).Вы можете создавать новые базы данных с другой локалью следующим образом:

Локаль отличается от кодировки, вы можете вручную указать это и/или кодировка:

 CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

Если вы хотите вызвать его вручную.

По сути, если вы его не укажете, он будет использовать системное значение по умолчанию, которое почти никогда не равно «C».

Так что если ваш show LC_COLLATE возвращает что-либо кроме «C» или «POSIX», тогда вы не используете standard C locale и вам нужно будет указать xxx_pattern_ops для ваших индексов.Обратите внимание также на предостережение что если вы хотите использовать операторы <, <=, > или >=, вам необходимо создать второй индекс без флага xxx_pattern_ops (если только вы не используете стандартную локаль C в своей базе данных, что бывает редко...).Просто == и LIKE (и т. д.), то второй индекс вам не нужен.Если вам не нужен LIKE тогда индекс с xxx_pattern_ops вам, возможно, тоже не нужен.

Даже если ваши индексы определены для сопоставления с индексами «по умолчанию», например

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default");

Этого недостаточно, если по умолчанию не используется сопоставление «C» (или POSIX, то же самое), его нельзя использовать для таких шаблонов, как LIKE 'ABC%'.Вам нужно что-то вроде этого:

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);

Если у вас есть возможность...

Вы можете воссоздать кластер базы данных с локалью C.

Вам нужно передать локаль initdb когда инициализация ваш экземпляр Postgres.

Вы можете сделать это независимо от языкового стандарта сервера или пользователя по умолчанию.

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

Он создает совершенно новый кластер и не переносит существующие базы данных или данные.Это будет дополнительная работа.

Более того, если вы можете рассмотреть возможность создания нового кластера, вам действительно следует рассмотреть возможность использования вместо него PostgreSQL 8.4, что может иметь локали для каждой базы данных, указанный в Оператор CREATE DATABASE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top