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

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

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

Ответ 1

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

Например:

SHOW LC_COLLATE
Индексы

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

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

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

Ответ 2

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)

Ответ 3

Если у вас есть опция...

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

ОК, из моих прочтений, кажется, что эта начальная настройка

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.

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

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

 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 для ваших индексов. Обратите внимание также на caveat, что если вы хотите использовать операторы <, < =, > или > =, вам необходимо создать второй индекс без флага 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);