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

Я пытаюсь оптимизировать таблицы PostgreSQL 8.3 DB в меру своих возможностей, и я не уверен, что мне нужно использовать varchar_pattern_ops для определенных столбцов, где я выступаю LIKE против первых n символов строки. Согласно документация использование xxx_pattern_ops нужен только "...когда сервер не использует стандартную локаль"C".

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

5 ответов


в настоящее время некоторые локали [docs] поддержка может быть установлена только во время initdb, но я думаю, что это относится к _pattern_ops можно изменить через SET во время выполнения, LC_COLLATE. Для просмотра заданных значений можно использовать показать.

например:

SHOW LC_COLLATE

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

о чем locale это набор правил о порядке символов, форматировании и подобных вещах, которые варьируются от языка/страны до другого языка/страны. Например, локаль fr_CA (французский язык в Канаде) может иметь некоторые другие правила сортировки (или способ отображения чисел и т. д.), Чем en_CA (английский язык в Канаде.). Стандарт Локаль " C " -это локаль по умолчанию, совместимая со стандартами POSIX. Действительны только строгие символы ASCII, а правила упорядочения и форматирования в основном те же, что и en_US (US English)

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


команду psql-л

согласно руководству

пример:

                               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)

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

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

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

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

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

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

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


ОК, с моей perusings, кажется, что эта исходная установка

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 (etc .) тогда вам не нужен второй индекс. Если вам не нужно 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);

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

проверить файл / 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