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.
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:
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.
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.
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";
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.
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.
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)
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.
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”.
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.
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.
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.
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";
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.
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.
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.
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ível | Descrição | 'f' = 'f' | 'ab' = U&'a\2063b' | 'x-y' = 'x_y' | 'g' = 'G' | 'n' = 'ñ' | 'y' = 'z' |
|---|---|---|---|---|---|---|---|
| level1 | Caractere de base | verdade | verdade | verdade | verdade | verdade | falso |
| level2 | Acentos | verdade | verdade | verdade | verdade | falso | falso |
| level3 | Caixa/Variantes[a] | verdade | verdade | verdade | falso | falso | falso |
| level4 | Pontuação[b] | verdade | verdade | falso | falso | falso | falso |
| identic | All | verdade | falso | falso | falso | falso | falso |
[b] somente com
| |||||||
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.
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
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
| Chave | Valores | Padrão | Descrição |
|---|---|---|---|
co | emoji, phonebk, standard, ... | standard | Tipo da ordenação. Veja Referências externas para ICU para obter opções e detalhes adicionais. |
ka | noignore, shifted | noignore |
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.
|
kb | true, false | false |
Comparações descendentes para as diferenças de nível 2.
Por exemplo, a localidade und-u-kb
classifica 'àe' antes de
'aé'.
|
kc | true, false | false |
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 |
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.
|
kn | true, false | false |
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'.
|
kk | true, false | false |
Ativa a normalização completa; isto pode afetar o desempenho.
A normalização básica é realizada mesmo quando definida como
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
|
kr |
space, punct,
symbol, currency,
digit, script-id
|
Atribui um ou mais dos valores válidos, ou qualquer
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 | |
ks | level1, level2, level3, level4, identic | level3 |
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.
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).
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.
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)
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.)