Como sei se o meu servidor de PostgreSQL está a usar a localização "C"?

estou a tentar optimizar as minhas tabelas de 8,3 DB PostgreSQL o melhor que posso, e não tenho a certeza se preciso de usar varchar_pattern_ops para certas colunas onde estou a executar um LIKE contra os primeiros n Caracteres de uma cadeia. De acordo com esta documentação, a utilização de xxx_pattern_ops só é necessária "...quando o servidor não usa o 'C' locale ' padrão.

Alguém pode explicar o que isto significa? Como posso verificar o local que a minha base de dados está a usar?

Author: Matt Huggins, 2009-11-03

5 answers

De momento, algum suporte locale [{[[7]}docs ] só pode ser definido à hora do initdb, mas penso que o relevante para _pattern_ops pode ser modificado através de SET à hora de execução, LC_COLLATE. Para ver os valores definidos, poderá usar o comando SHOW.

Por exemplo:

SHOW LC_COLLATE

_pattern_ops os índices são úteis em colunas que usam construções de correspondência de padrões, como o LIKE ou o 'regexps'. Você ainda tem que fazer um índice regular (Sem _pattern_ops) para fazer a pesquisa de igualdade em um índice. Por isso, tens de o fazer. leve tudo isso em consideração para ver se você precisa desses índices em suas tabelas.

Sobre o que é locale , é um conjunto de regras sobre ordenação de caracteres, formatação e coisas semelhantes que variam de Língua/país para outra língua/País. Por exemplo, o locale fr_CA (francês no Canadá) pode ter algumas regras de ordenação diferentes (ou maneira de exibir números e assim por diante) do que en_CA (Inglês no Canadá).). A localização padrão " C " é o padrão compatível com os Padrões POSIX localidade. Apenas caracteres ASCII restritos são válidos, e as regras de ordenação e formatação são principalmente as de en_US (Inglês DOS EUA)

Em computação, locale é um conjunto de parâmetros que definem o língua, país e qualquer preferências da variante que o utilizador quer ver na sua interface de utilizador. Normalmente, um identificador local consiste de pelo menos um identificador de língua e um identificador de região.

 14
Author: Vinko Vrsalovic, 2009-11-03 07:46:38

Psql-l

De acordo com o manual

Exemplo de saída:

                               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)
 8
Author: Pavel Korshikov, 2015-07-02 20:34:19
Se tiver a opção... Pode recriar o conjunto de bases de dados com a localização C.

Você precisa passar a localização para initdb Quando inicializar a sua instância de Postgres.

Você pode fazer isso independentemente de qual é o padrão do servidor ou localização do Usuário.

Isso é um comando de administração de servidores, Não uma tarefa de desenhadores de esquemas de bases de dados. O conjunto contém todas as bases de dados do servidor, não apenas a que você é optimizar. Cria um novo conjunto e não migra nenhuma das suas bases de dados ou dados existentes. Isso seria trabalho adicional.

Além disso, se estiver numa posição em que possa considerar a criação de um novo conjunto como uma opção, deverá considerar a utilização do PostgreSQL 8.4 em vez disso, que poderá ter localizações por base de dados, especificadas no criar uma declaração de base de dados.

 1
Author: Stephen Denne, 2015-07-02 20:37:42
Ok, pelas minhas conclusões, parece que esta configuração inicial

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.

Basicamente especifica o local" default " para toda a base de dados que você criar depois disso (ou seja, especifica as configurações para template1, que é o modelo padrão). Você pode criar novas bases de dados com um local diferente como este:

A localização é diferente da codificação, pode indicar manualmente e / ou codificação:

 CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
Se quiser ligar manualmente as.

Basicamente se você não especificar, ele usa o padrão do sistema, que é quase nunca "C".

Por isso, se o seu show LC_COLLATE devolve algo que não seja "C" ou "POSIX", então não está a usar o standard C locale e terá de especificar o xxx_ prattern_ops para os seus índices. Note também o caveat que se quiser usar os operadores , ou >= necessita de criar um segundo índice sem a bandeira xxx_pattern_ops (a menos que esteja a usar a configuração C normal na sua base de dados, o que é raro...). Para just = = e LIKE (etc.) então você não precisa de um segundo índice. Se você não precisa LIKE então você não precisa do índice com xxx_pattern_ops, possivelmente, também.

Mesmo que os seus índices estejam definidos para comparar com o" padrão " como

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

Isto não é suficiente, a menos que o padrão seja a colação "C" (ou POSIX, a mesma coisa), não pode ser usado para padrões como LIKE 'ABC%'. Precisas de algo assim.

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);
 1
Author: rogerdpack, 2015-07-02 21:24:08

Existe também outra maneira (assumindo que você quer verificá-los, não modificá-los):

Verifique o ficheiro / var/lib/postgres/data / postgresql.conf Devem ser encontradas as seguintes linhas:

# 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
 0
Author: pawos, 2015-07-02 20:44:22