23.2. Suporte a ordenação #

23.2.1. Conceitos
23.2.2. Gerenciamento de ordenações
23.2.3. Ordenações ICU personalizadas

A funcionalidade de ordenação permite especificar a ordem de classificação e o comportamento da classificação de caracteres dos dados por coluna, ou mesmo por operação. Isto alivia a restrição de que as configurações LC_COLLATE e LC_CTYPE de um banco de dados não podem ser alteradas após sua criação.

23.2.1. Conceitos #

Conceitualmente, toda expressão de um tipo de dados ordenável (collatable) tem uma ordenação. (Os tipos de dados ordenáveis ​​nativos são text, varchar e char. Os tipos-base definidos pelo usuário também podem ser marcados como ordenáveis ​​e, é claro, um domínio sobre um tipo de dados ordenável é ordenável.) Se a expressão for uma referência a coluna, a ordenação da expressão será a ordenação definida da coluna. Se a expressão for uma constante, a ordenação será a ordenação padrão do tipo de dados da constante. A ordenação de uma expressão mais complexa é derivada das ordenações de suas entradas, conforme descrito abaixo.

A ordenação de uma expressão pode ser a ordenação padrão, que significa as configurações de localidade definidas para o banco de dados. Também é possível que a ordenação de uma expressão seja indeterminada. Nesses casos, as operações de ordenação, e outras operações que precisam conhecer a ordenação, vão falhar.

Quando o sistema de banco de dados precisa executar uma ordenação, ou uma classificação de caracteres, ele usa a ordenação da expressão de entrada. Isto acontece, por exemplo, com as cláusulas ORDER BY, e chamadas de função ou operador como o <. A ordenação a ser aplicada em uma cláusula ORDER BY é simplesmente a ordenação da chave de classificação. A ordenação a ser aplicada para uma chamada de função, ou operador, é derivada dos argumentos, conforme descrito abaixo. Além dos operadores de comparação, as ordenações são levadas em conta por funções que fazem conversão entre letras minúsculas e maiúsculas, como lower, upper e initcap; por operadores de correspondência de padrão; e por to_char e funções relacionadas.

Para uma chamada de função ou operador, a ordenação derivada do exame das ordenações dos argumentos é usada em tempo de execução, para executar a operação especificada. Se o resultado da chamada da função, ou operador, for de um tipo de dados ordenável, a ordenação também será usada no momento da análise como a ordenação definida da função ou expressão do operador, caso haja uma expressão ao redor que exija o conhecimento de sua ordenação.

A derivação da ordenação de uma expressão pode ser implícita ou explícita. Esta distinção afeta como as ordenações são combinadas, quando várias ordenações diferentes aparecem em uma expressão. Uma derivação de ordenação explícita ocorre quando a cláusula COLLATE é usada; todas as outras derivações de ordenação são implícitas. Quando precisam ser combinadas várias ordenações como, por exemplo, em uma chamada de função, são usadas as seguintes regras:

  1. Se qualquer expressão de entrada tiver uma derivação de ordenação explícita, todas as ordenações explicitamente derivadas entre as expressões de entrada deverão ser as mesmas, caso contrário, será relatado um erro. Se alguma ordenação explicitamente derivada estiver presente, este será o resultado da combinação de ordenação.

  2. Caso contrário, todas as expressões de entrada devem ter a mesma derivação de ordenação implícita, ou a ordenação padrão. Se estiver presente alguma ordenação não-padrão, esta será o resultado da combinação de ordenação. Caso contrário, o resultado é a ordenação padrão.

  3. Se houver ordenações implícitas não-padrão conflitantes entre as expressões de entrada, a combinação será considerada tendo uma ordenação indeterminada. Esta não é uma condição de erro, a menos que a função específica que está sendo chamada exija o conhecimento da ordenação a ser aplicada. Se isto acontecer, será relatado um erro em tempo de execução.

Por exemplo, considerando-se a seguinte definição de tabela: [144].

CREATE TABLE test1 (
    a text COLLATE "de-DE-x-icu",
    b text COLLATE "es-ES-x-icu"
    ...
);

Então em

SELECT a < 'foo' FROM test1;

a comparação < é realizada segundo as regras de-DE-x-icu, porque a expressão combina uma ordenação derivada implicitamente com a ordenação padrão. Mas em

SELECT a < ('foo' COLLATE "fr-FR-x-icu") FROM test1;

a comparação é realizada segundo as regras fr-FR-x-icu, porque a derivação de ordenação (collation) explícita prevalece sobre a implícita. Além disso, dado

SELECT a < b FROM test1;

o analisador não consegue determinar qual ordenação aplicar, uma vez que as colunas a e b possuem ordenações implícitas conflitantes. Como o operador < precisa saber qual ordenação usar, isto resulta em erro. O erro pode ser resolvido anexando um especificador de ordenação explícito a qualquer uma das expressões de entrada, da seguinte forma:

SELECT a < b COLLATE "de-DE-x-icu" FROM test1;

ou de forma equivalente

SELECT a COLLATE "de-DE-x-icu" < b FROM test1;

Por outro lado, o caso estruturalmente semelhante

SELECT a || b FROM test1;

não resulta em erro, porque o operador || não leva em conta as ordenações: seu resultado é o mesmo, independentemente da ordenação.

A ordenação atribuída a uma função, ou às expressões de entrada combinadas do operador, também é considerada aplicável ao resultado da função ou do operador, se a função ou o operador fornecer um resultado de um tipo de dados que pode ser ordenado. Portanto, em

SELECT * FROM test1 ORDER BY a || 'foo';

a ordenação será feita segundo as regras para de-DE-x-icu. Mas a consulta a seguir

SELECT * FROM test1 ORDER BY a || b;

resulta em erro, porque mesmo que o operador || não precise conhecer a ordenação, a cláusula ORDER BY precisa. Como antes, o conflito pode ser resolvido com um especificador de ordenação explícito:

SELECT * FROM test1 ORDER BY a || b COLLATE "fr-FR-x-icu";

23.2.2. Gerenciamento de ordenações #

Uma ordenação é um objeto de esquema do SQL, que mapeia um nome do SQL para localidades fornecidas por bibliotecas instaladas no sistema operacional. Uma definição de ordenação tem um provedor, que especifica qual biblioteca fornece os dados de localidade. O nome de provedor padrão é libc, que usa as localidades fornecidas pela biblioteca C do sistema operacional. Estes são os locais usados ​​pela maioria das ferramentas fornecidas pelo sistema operacional. Outro provedor é o icu, que usa a biblioteca ICU externa. Os locais ICU só podem ser usados ​​quando o suporte para ICU estava configurado quando o PostgreSQL foi construído.

Um objeto de ordenação fornecido pela libc aponta para uma combinação de configurações LC_COLLATE e LC_CTYPE, conforme aceito pela chamada da biblioteca do sistema setlocale(). (Como o nome sugere, o objetivo principal de uma ordenação é definir LC_COLLATE, que controla a ordem de classificação. Mas, na prática, é raramente necessário ter uma configuração de LC_CTYPE diferente de LC_COLLATE, portanto é mais conveniente juntá-los sob um conceito, do que criar outra infraestrutura para definir LC_CTYPE por expressão.) Além disso, uma ordenação libc está vinculada a uma codificação de conjunto de caracteres (veja Suporte a conjunto de caracteres). O mesmo nome de ordenação pode existir para diferentes codificações.

Um objeto de ordenação fornecido pelo icu aponta para um ordenador com o nome fornecido pela biblioteca ICU. A biblioteca ICU não oferece suporte a configurações separadas de collate e ctype, portanto elas são sempre as mesmas. Além disso, as ordenações ICU são independentes da codificação, portanto sempre há apenas uma ordenação ICU com um determinado nome em um banco de dados.

23.2.2.1. Ordenações padrão #

Em todas as plataformas há suporte para as seguintes ordenações:

unicode

Esta ordenação do padrão SQL realiza a classificação usando o Algoritmo de Ordenação Unicode com a Tabela de Elementos de Ordenação Unicode Padrão. Está disponível em todas as codificações. É necessário suporte a ICU para utilizar esta ordenação, e o comportamento pode mudar quando o PostgreSQL é construído com uma versão diferente do ICU. (Esta ordenação tem o mesmo comportamento que a localidade raiz do ICU; veja und-x-icu (para undefined).)

ucs_basic

Esta ordenação do padrão SQL utiliza os valores dos pontos de código Unicode em vez da ordem da linguagem natural, e apenas as letras ASCII de A a Z são tratadas como letras. O comportamento é eficiente e estável em todas as versões. Disponível apenas para a codificação UTF8. (Esta ordenação tem o mesmo comportamento que a especificação de localidade C da libc na codificação UTF8.)

pg_unicode_fast

Esta ordenação classifica com base nos valores dos pontos de código Unicode, em vez da ordem de linguagem natural. Para as funções lower, initcap e upper, é usado o mapeamento completo de maiúsculas/minúsculas do Unicode. Para correspondência de padrões (incluindo expressões regulares), é usada a variante Standard vista em Compatibility Properties. O comportamento é eficiente e estável dentro de uma versão principal do PostgreSQL. Disponível apenas para a codificação UTF8.

pg_c_utf8

Esta ordenação classifica com base nos valores dos pontos de código Unicode, em vez da ordem de linguagem natural. Para as funções lower, initcap e upper, é usada o mapeamento simples do Unicode. Para correspondência de padrões (incluindo expressões regulares), é usada a variante POSIX Compatible vista em Compatibility Properties. O comportamento é eficiente e estável dentro de uma versão principal do PostgreSQL. Disponível apenas para a codificação UTF8.

C (equivalente ao POSIX)

As ordenações C e POSIX são baseadas no comportamento C tradicional. Elas classificam por valores de byte em vez da ordem da linguagem natural, e apenas as letras ASCII de A a Z são tratadas como letras. O comportamento é eficiente e estável em todas as versões para uma determinada codificação de banco de dados, mas pode variar entre diferentes codificações de banco de dados.

default

A ordenação default seleciona a localidade especificada no momento da criação do banco de dados.

Podem estar disponíveis opções de ordenação adicionais, dependendo do suporte do sistema operacional. A eficiência e a estabilidade dessas ordenações adicionais dependem do provedor de ordenação, da versão do provedor e da localidade.

23.2.2.2. Ordenações predefinidas #

Se o sistema operacional oferecer suporte para o uso de várias localidades em um único programa (newlocale e funções relacionadas), ou se o suporte para ICU estiver configurado, então quando a instância é inicializada o initdb preenche o catálogo do sistema pg_collation com ordenações baseadas em todas as localidades encontradas no sistema operacional no momento.

Para inspecionar as localidades disponíveis no momento é usada a consulta SELECT * FROM pg_collation, ou o comando \dOS+ no psql.

Exemplo 23.1. Exemplo do tradutor

Ordenações BR

Este exemplo consulta o catálogo do sistema pg_collation para listar as ordenações contendo BR no nome.

SELECT collname
FROM pg_collation
WHERE collname LIKE '%BR%';

   collname
--------------
 pt_BR.utf8
 pt_BR
 es-BR-x-icu   -- Espanhol falado no Brasil
 kgp-BR-x-icu  -- Língua kaingang, falada no sul do Brasil.
 pt-BR-x-icu
 yrl-BR-x-icu  -- Língua Geral Indígena da Amazônia
(6 linhas)


23.2.2.2.1. Ordenações libc #

Por exemplo, o sistema operacional pode fornecer uma localidade chamada de_DE.utf8. Então o initdb criaria uma ordenação chamada de_DE.utf8 para codificar UTF8 possuindo LC_COLLATE e LC_CTYPE definidos como de_DE.utf8. Também criará uma ordenação truncada com a etiqueta .utf8 removida do nome. Portanto, também se poderia usar a ordenação sob o nome de_DE, que é menos complicado de escrever, e torna o nome menos dependente da codificação. Veja que, no entanto, o conjunto inicial de nomes de ordenação depende da plataforma.

O conjunto padrão de ordenações fornecido pela libc aponta diretamente para os locais instalados no sistema operacional, que podem ser listados usando o comando locale -a. Caso seja necessária uma ordenação libc que tenha valores diferentes para LC_COLLATE e LC_CTYPE, ou se novas localidades forem instaladas no sistema operacional após a inicialização do sistema de banco de dados, uma nova ordenação poderá ser criada usando o comando CREATE COLLATION. As novas localidades do sistema operacional também podem ser importadas em massa usando a função pg_import_system_collations().

Dentro de qualquer banco de dados específico, apenas as ordenações que usam a codificação desse banco de dados são de interesse. As demais entradas em pg_collation são ignoradas. Portanto, um nome de ordenação truncado, como de_DE, pode ser considerado exclusivo em um determinado banco de dados, mesmo que não seja exclusivo globalmente. O uso dos nomes de ordenação truncados é recomendado, uma vez que será uma coisa a menos que se precisará alterar se decidir alterar para outra codificação de banco de dados. Note-se, entretanto, que as ordenações default, C e POSIX podem ser usadas independentemente da codificação do banco de dados.

O PostgreSQL considera objetos de ordenação distintos como incompatíveis, mesmo que tenham propriedades idênticas. Assim, por exemplo,

SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;

irá relatar erro, mesmo que as ordenações C e POSIX tenham comportamentos idênticos. Portanto, não se recomenda misturar nomes de ordenação truncados e não truncados.

23.2.2.2.2. Ordenações ICU #

Para o ICU, não faz sentido enumerar todos os nomes de localidades possíveis. O ICU usa um sistema de nomenclatura específico para localidades, mas há muito mais maneiras de se dar nome a uma localidade do que localidades realmente distintas. O initdb usa as APIs ICU para extrair um conjunto de localidades distintas, para preencher o conjunto inicial de ordenações. As ordenações fornecidas pelo ICU são criadas no ambiente SQL com nomes no formato de etiqueta de linguagem BCP 47, com a extensão de uso privado -x-icu anexada, para distingui-las das libc ​​locais.

A seguir estão alguns exemplos de ordenações que podem ser criadas:

de-x-icu #

Ordenação alemã, variante padrão

de-AT-x-icu #

Ordenação alemã para a Áustria, variante padrão

(Há também, digamos, de-DE-x-icu ou de-CH-x-icu, mas até o momento são equivalentes a de-x-icu.)

und-x-icu (para undefined) #

A ordenação raiz da ICU usada para obter uma ordem de classificação razoável independente da linguagem.

Algumas codificações (usadas com menos frequência) não têm suporte pelo ICU. Quando a codificação do banco de dados é uma dessas, as entradas de ordenação ICU em pg_collation são ignoradas. Tentar usar uma delas irá relatar um erro do tipo ordenação "de-x-icu" para codificação "WIN874" não existe.

23.2.2.3. Criação de novos objetos de ordenação #

Se as ordenações padrão e predefinidas não forem suficientes, os usuários poderão criar seus próprios objetos de ordenação, usando o comando SQL CREATE COLLATION.

As ordenações padrão e predefinidas estão no esquema pg_catalog, como todos os objetos predefinidos. As ordenações definidas pelo usuário devem ser criadas em esquemas de usuário. Isto também garante que sejam salvas pelo pg_dump.

23.2.2.3.1. Ordenações libc #

As novas ordenações libc podem ser criadas assim:

CREATE COLLATION ptbr (provider = libc, locale = 'pt_BR.utf8');

Os valores exatos aceitáveis ​​para a cláusula locale neste comando dependem do sistema operacional. Em sistemas do tipo Unix, o comando locale -a lista elas.

$ locale -a | grep BR
pt_BR
pt_BR.utf8

Como as ordenações libc predefinidas já incluem todas as ordenações definidas no sistema operacional quando a instância é inicializada, geralmente não é necessário criar novas manualmente. Os motivos para criá-las podem ser: se for desejado um sistema de nomes diferente (neste caso, veja também Cópia de ordenação); ou se o sistema operacional tiver sido atualizado para fornecer novas definições de localidade (neste caso, veja também a Tabela 9.104.

23.2.2.3.2. Ordenações ICU #

As ordenações ICU podem ser criadas da seguinte forma:

CREATE COLLATION ptbricu (provider = icu, locale = 'pt-BR');

As localidades ICU são especificadas como etiquetas de linguagem BCP 47, mas também são aceitas a maioria dos nomes de localidade no estilo libc. Se possível, os nomes de localidade no estilo libc são transformados em etiquetas de linguagem.

As novas configurações de ordenação ICU podem personalizar amplamente o comportamento de ordenação, incluindo atributos de ordenação nas etiquetas de linguagem. Veja Ordenações ICU personalizadas para obter mais detalhes e exemplos.

23.2.2.3.3. Cópia de ordenação #

O comando CREATE COLLATION também pode ser usado para criar uma nova ordenação a partir de uma ordenação existente, que pode ser útil para usar nomes de ordenação independentes do sistema operacional em aplicações, criar nomes de compatibilidade, ou usar uma ordenação fornecida pelo ICU com um nome mais legível. Por exemplo:

CREATE COLLATION alemão FROM "de-DE-x-icu";
CREATE COLLATION francês FROM "fr-x-icu";

23.2.2.4. Ordenações não-determinísticas #

Uma ordenação é determinística ou não determinística. Uma ordenação determinística usa comparações determinísticas, o que significa que considera as cadeias de caracteres iguais apenas se consistirem na mesma sequência de bytes. Uma comparação não determinística pode determinar que cadeia de caracteres sejam iguais, mesmo que consistam em bytes diferentes. Situações típicas incluem a comparação que não diferencia letras maiúsculas de minúsculas, comparação que não diferencia acentos, bem como comparação de cadeias de caracteres em diferentes formas normais Unicode. Cabe ao provedor de ordenação realmente implementar estas comparações não sensíveis; o sinalizador determinístico determina apenas se os empates devem ser resolvidos usando a comparação byte-a-byte. Veja também Unicode Technical Standard 10 para obter mais informações sobre a terminologia.

Para criar uma ordenação não determinística, deve ser especificada a propriedade deterministic = false no comando CREATE COLLATION. Por exemplo:

CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);

Este exemplo usa a ordenação Unicode padrão de maneira não determinística. Em particular, permite que cadeias de caracteres em diferentes formas normais sejam comparadas corretamente. Exemplos mais interessantes fazem uso dos recursos de personalização do ICU explicados acima. Por exemplo:

CREATE COLLATION ignora_min_mai (provider = icu,
                                 locale = 'und-u-ks-level2',
                                 deterministic = false);
CREATE COLLATION ignora_acentos (provider = icu,
                                 locale = 'und-u-kc-ks-level1',
                                 deterministic = false);

Todas as ordenações padrão e predefinidas são determinísticas, todas as ordenações definidas pelo usuário são determinísticas por padrão. Embora as ordenações não determinísticas forneçam um comportamento mais correto, especialmente ao considerar todo o poder do Unicode e seus muitos casos especiais, elas também têm algumas desvantagens. Acima de tudo, seu uso leva a uma penalidade de desempenho. Note-se, em particular, que a Árvore-B não pode usar deduplicação com índices que usam uma ordenação não determinística. Além disso, certas operações não são possíveis com ordenações não determinísticas, como algumas operações de correspondência de padrão. Portanto, devem ser usadas ​​apenas nos casos em que são especificamente desejados.

Dica

Para lidar com texto em diferentes formas de normalização Unicode, também é uma opção usar as funções/expressões normalize e is normalized para pré-processar ou verificar as cadeias de caracteres, em vez de usar ordenações não determinísticas. Existem diferentes custos/benefícios para cada abordagem.

23.2.3. Ordenações ICU personalizadas #

ICU permite um controle abrangente sobre o comportamento da ordenação, definindo novas ordenações com configurações de ordenação como parte da etiqueta de linguagem. Estas configurações podem modificar a ordenação para atender a diversas necessidades. Por exemplo:

-- ignorar as diferenças de acento e letras maiúsculas/minúsculas.
CREATE COLLATION ignora_acento_min_mai (provider = icu,
                                        deterministic = false,
                                        locale = 'und-u-ks-level1');
SELECT 'Å' = 'A' COLLATE ignora_acento_min_mai; -- verdade
SELECT 'z' = 'Z' COLLATE ignora_acento_min_mai; -- verdade

-- letras maiúsculas ordenadas antes das minúsculas.
CREATE COLLATION mai_antes (provider = icu,
                            locale = 'und-u-kf-upper');
SELECT 'B' < 'b' COLLATE mai_antes; -- verdade

-- tratar os dígitos numericamente e ignorar a pontuação.
CREATE COLLATION num_ignore_punct (provider = icu,
                                   deterministic = false,
                                   locale = 'und-u-ka-shifted-kn');
SELECT 'id-45' < 'id-123' COLLATE num_ignore_punct; -- verdade
SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- verdade

Muitas das opções disponíveis são descritas em Configurações de ordenação para uma localidade ICU, ou veja Referências externas para ICU para obter mais detalhes.

23.2.3.1. Níveis de comparação ICU #

A comparação de duas cadeias de caracteres (ordenação) no ICU é determinada por um processo multinível, onde as características textuais são agrupadas em níveis. O tratamento de cada nível é controlado pelas configurações de ordenação. Níveis mais altos correspondem a funcionalidades textuais mais refinadas.

A Tabela 23.1 mostra quais diferenças nas funcionalidades textuais são consideradas significativas ao determinar a igualdade no nível em questão. O caractere Unicode U+2063 é um separador invisível e, como pode ser visto na tabela, é ignorado em todos os níveis de comparação menores que identic.

Tabela 23.1. Níveis de ordenação ICU

NívelDescrição'f' = 'f''ab' = U&'a\2063b''x-y' = 'x_y''g' = 'G''n' = 'ñ''y' = 'z'
level1Caractere de baseverdadeverdadeverdadeverdadeverdadefalso
level2Acentosverdadeverdadeverdadeverdadefalsofalso
level3Caixa/Variantes[a]verdadeverdadeverdadefalsofalsofalso
level4Pontuação[b]verdadeverdadefalsofalsofalsofalso
identicAllverdadefalsofalsofalsofalsofalso

[b] somente com ka-shifted; veja Tabela 23.2


Em todos os níveis, mesmo com a normalização completa inativa, é realizada uma normalização básica. Por exemplo, 'á' pode ser composto pelos pontos de código U&'\0061\0301' ou pelo ponto de código único U&'\00E1', e estas sequências serão consideradas iguais mesmo no nível identic. Para tratar qualquer diferença na representação do ponto de código como distinta, deve ser usada uma ordenação criada com deterministic definido como true.

23.2.3.1.1. Exemplos de nível de comparação #
CREATE COLLATION level3 (provider = icu,
                         deterministic = false,
                         locale = 'und-u-ka-shifted-ks-level3');
CREATE COLLATION level4 (provider = icu,
                         deterministic = false,
                         locale = 'und-u-ka-shifted-ks-level4');
CREATE COLLATION identic (provider = icu,
                          deterministic = false,
                          locale = 'und-u-ka-shifted-ks-identic');

-- separador invisível ignorado em todos os níveis, exceto em identic.
SELECT 'ab' = U&'a\2063b' COLLATE level4;  -- verdade
SELECT 'ab' = U&'a\2063b' COLLATE identic; -- falso

-- pontuação ignorada no nível 3, mas não no nível 4.
SELECT 'x-y' = 'x_y' COLLATE level3; -- verdade
SELECT 'x-y' = 'x_y' COLLATE level4; -- falso

23.2.3.2. Configurações de ordenação para uma localidade ICU #

A Tabela 23.2 mostra as configurações de ordenação disponíveis, que podem ser usadas como parte de uma etiqueta de linguagem para personalizar a ordenação.

Tabela 23.2. Configurações de ordenação ICU

ChaveValoresPadrãoDescrição
coemoji, phonebk, standard, ...standard Tipo da ordenação. Veja Referências externas para ICU para obter opções e detalhes adicionais.
kanoignore, shiftednoignore Se definido como shifted, fará com que alguns caracteres (por exemplo, pontuação ou espaço) sejam ignorados na comparação. A chave ks deve ser definida como level3 ou inferior para ter efeito. A chave kv deve ser definida para controlar quais classes de caracteres são ignoradas.
kbtrue, falsefalse Comparações descendentes para as diferenças de nível 2. Por exemplo, a localidade und-u-kb classifica 'àe' antes de 'aé'.
kctrue, falsefalse

Separa as maiúsculas e minúsculas no nível 2.5 que fica entre os acentos e outras características de nível 3.

Se definido como true e ks estiver definido como level1, os acentos serão ignorados, mas as maiúsculas e minúsculas serão consideradas.

kf upper, lower, false false Se definido como upper, as letras maiúsculas serão classificadas antes das minúsculas. Se definido como lower, as letras minúsculas serão classificadas antes das maiúsculas. Se definido como false, a classificação dependerá das regras da localidade.
kntrue, falsefalse Se definido como true, os números dentro de uma cadeia de caracteres são tratados como um único valor numérico em vez de uma sequência de dígitos. Por exemplo, 'id-45' é classificado antes de 'id-123'.
kktrue, falsefalse

Ativa a normalização completa; isto pode afetar o desempenho. A normalização básica é realizada mesmo quando definida como false. Localidades para linguagens que requerem normalização completa geralmente a ativam por padrão.

A normalização completa é importante em alguns casos, como quando vários acentos são aplicados a um único caractere. Por exemplo, as sequências de pontos de código U&'\0065\0323\0302' e U&'\0065\0302\0323' representam uma letra e com acento circunflexo e acento ponto-inferior aplicados em ordens diferentes. Com a normalização completa ativa, estas sequências de pontos de código são tratadas como sendo iguais; caso contrário, são consideradas como sendo diferentes.

kr space, punct, symbol, currency, digit, script-id  

Atribui um ou mais dos valores válidos, ou qualquer script-id BCP 47, como, por exemplo, latn (Latino) ou grek (Grego). Valores múltiplos são separados por -.

Redefine a ordenação das classes de caracteres; os caracteres pertencentes a uma classe que aparece mais cedo na lista são classificados antes dos caracteres pertencentes a uma classe que aparece mais tarde na lista. Por exemplo, o valor digit-currency-space (como parte de uma etiqueta de linguagem, como und-u-kr-digit-currency-space) classifica a pontuação antes de dígitos e espaços.

kslevel1, level2, level3, level4, identiclevel3 Sensibilidade (ou força) na determinação da igualdade, sendo level1 o menos sensível às diferenças e identic o mais sensível às diferenças. Veja Tabela 23.1 para mais detalhes.
kv space, punct, symbol, currency punct Classes de caracteres ignoradas durante a comparação no nível 3. A definição de um valor posterior inclui valores anteriores; por exemplo symbol também inclui punct e space nos caracteres a serem ignorados. A chave ka deve ser definida como shifted e a chave ks deve ser definida como level3 ou inferior para ter efeito.

Os valores padrão podem variar conforme a a localidade. A tabela acima não tem a intenção de ser completa. Veja Referências externas para ICU para obter opções e detalhes adicionais.

Nota

Para muitas configurações de ordenação, deve-se criar a ordenação com deterministic configurado como false para que a configuração tenha o efeito desejado (veja Ordenações não-determinísticas). Além disso, algumas configurações só têm efeito quando a chave ka é definida como shifted (veja Tabela 23.2).

23.2.3.3. Exemplos de configurações de ordenação #

CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk'); #

Ordenação alemã com tipo de ordenação de lista telefônica

CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji'); #

Ordenação raiz com tipo de ordenação Emoji, conforme o Padrão Técnico Unicode nº 51.

CREATE COLLATION latinlast (provider = icu, locale = 'en-u-kr-grek-latn'); #

Classifica as letras gregas antes das latinas. (O padrão é letras latinas antes das gregas.)

CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); #

Classifica as letras maiúsculas antes das minúsculas. (O padrão é letras minúsculas primeiro.)

CREATE COLLATION special (provider = icu, locale = 'en-u-kf-upper-kr-grek-latn'); #

Combina as duas opções acima.

23.2.3.4. Regras de personalização ICU #

Se as opções fornecidas pelas configurações de ordenação mostradas acima não forem suficientes, a ordem dos elementos pode ser alterada com regras de personalização, cuja sintaxe é detalhada em Collation Customization.

Este pequeno exemplo cria uma ordenação baseada na localidade raiz com uma regra de personalização:

CREATE COLLATION custom (provider = icu,
                 locale = 'und',
                 rules = '&V << w <<< W');

Com esta regra, a letra W é classificada depois de V, mas é tratada como uma diferença secundária semelhante a um acento. Regras como esta estão contidas nas definições de localidade de algumas linguagens. (Evidentemente, se uma definição de localidade já contiver as regras desejadas, não será necessário especificá-las novamente de forma explícita.)

A seguir está um exemplo mais complexo. A declaração a seguir configura uma ordenação chamada ebcdic com regras para classificar caracteres US-ASCII na ordem da codificação EBCDIC.

CREATE COLLATION ebcdic (provider = icu, locale = 'und',
rules = $$
& ' ' < '.' < '<' < '(' < '+' < \|
< '&' < '!' < '$' < '*' < ')' < ';'
< '-' < '/' < ',' < '%' < '_' < '>' < '?'
< '`' < ':' < '#' < '@' < \' < '=' < '"'
<*a-r < '~' <*s-z < '^' < '[' < ']'
< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9
$$);

SELECT c
FROM (VALUES ('a'), ('b'), ('A'), ('B'),
             ('1'), ('2'), ('!'), ('^')) AS x(c)
ORDER BY c COLLATE ebcdic;

 c
---
 !
 a
 b
 ^
 A
 B
 1
 2
(8 linhas)

23.2.3.5. Referências externas para ICU #

Esta seção (Ordenações ICU personalizadas) é apenas uma breve visão geral do comportamento do ICU e das etiquetas de linguagem. Devem ser consultados os seguintes documentos para obter detalhes técnicos, opções adicionais e novos comportamentos:



[144] Para criar localidades no sistema operacional Debian 12 é necessário editar o arquivo /etc/locale.gen, remover o comentário das localidades a serem criadas, executar o comando locale-gen e reiniciar o PostgreSQL. Em seguida é necessário importar as localidades do sistema operacional executando o comando SELECT pg_import_system_collations('pg_catalog');. É necessário ser um superusuário do sistema operacional e do PostgreSQL para executar estes comandos. (N. T.)