Tenho o Postgres 9.4.4 em execução no Debian e recebo o seguinte ORDER BY
comportamento:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
E uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
No entanto, no meu iMac, com o Postgres 9.3.4, recebo o seguinte:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
E o uname -a
:
Darwin ---- 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64
Estou perplexo com o motivo pelo qual a versão Debian parece não fazer distinção entre maiúsculas e minúsculas e a versão do OS X não. O que estou faltando ou que outras informações eu preciso fornecer?
Atualização : No meu Mac, a pg_collation
tabela mostra que tenho um en_US.UTF-8
agrupamento, mas no Debian, tenho um en_US.utf8
agrupamento. Assim, no meu Mac:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.UTF-8";
bar
-----------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
E no Debian:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.utf8";
bar
-----------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
Então, en_US.UTF-8
e en_US.utf8
tem ordens de classificação diferentes?
postgresql
collation
Curtis Poe
fonte
fonte
'D d a A c b CD Capacitor'
não estar sendo lançada como umtext
campo no Mac? IE, tenteSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
ver o que acontece ...select * from pg_collation
mostra a caixa Debianen_US.utf8
, enquanto o OS X possuien_US.UTF-8
. Usando os forçar explicitamente agrupamento nas caixas respectivas mostra diferentes ordens de classificação :(Respostas:
Não, ambos são iguais, apenas uma convenção de nomenclatura diferente.
Sim você está correto. Esse é o comportamento padrão no Mac. Os agrupamentos não funcionam em nenhum sistema operacional BSD (incluindo OSX) para
UTF8
codificação.Aqui está uma referência para provar que:
Problemas com a ordem de classificação (os códigos de idioma UTF8 não funcionam
Como um a_horse_with_no_name disse, o Postgres usa a implementação de agrupamento do sistema operacional. Não há como obter o mesmo resultado nos dois sistemas operacionais.
No seu caso, você pode (eu disse talvez) fazer assim:
ORDER BY lower(fieldname)
.fonte
ORDER BY function()
em conjuntos de resultados potencialmente grandes - porque ele interrompe a utilização de um índice para a classificação, quase certamente causará uma operação de classificação extra (possivelmente em disco) e pode alterar o método do planejador de consulta de atacar sua consulta mais amplamente .