Mam Postgres 9.4.4 działający na Debianie i otrzymuję następujące ORDER BY
zachowanie:
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)
I uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Jednak na moim komputerze iMac z Postgres 9.3.4 otrzymuję:
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)
I 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
Dziwię się, dlaczego wersja Debiana wydaje się nie rozróżniać wielkości liter, a wersja OS X nie. Czego mi brakuje lub jakie inne informacje muszę podać?
Aktualizacja : Na moim komputerze Mac pg_collation
tabela pokazuje, że mam en_US.UTF-8
zestawienie, ale w Debianie mam en_US.utf8
zestawienie. Tak więc na moim komputerze 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)
A na Debianie:
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)
Więc en_US.UTF-8
i en_US.utf8
masz różne porządki sortowania?
postgresql
collation
Curtis Poe
źródło
źródło
'D d a A c b CD Capacitor'
nie zostanie rzucona jaktext
pole na komputerze Mac? IE, spróbujSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
zobaczyć, co się stanie ...select * from pg_collation
pokazuje to okno Debianaen_US.utf8
, podczas gdy OS X taken_US.UTF-8
. Używanie ich do wymuszania sortowania w odpowiednich polach pokazuje różne porządki sortowania :(Odpowiedzi:
Nie, oba są takie same, tylko inna konwencja nazewnictwa.
Tak, masz rację. Jest to domyślne zachowanie na komputerze Mac. Zestawienia nie działają na żadnym systemie operacyjnym BSD (w tym OSX) do
UTF8
kodowania.Oto odniesienie, aby udowodnić, że:
Problemy z kolejnością sortowania (ustawienia regionalne UTF8 nie działają
Jak powiedział a_horse_with_no_name , Postgres używa implementacji sortowania z systemu operacyjnego. Nie ma sposobu, aby uzyskać ten sam wynik w obu systemach operacyjnych.
W twoim przypadku może (powiedziałem może) zrobić tak:
ORDER BY lower(fieldname)
.źródło
ORDER BY function()
potencjalnie dużych zestawów wyników - ponieważ zatrzymuje indeks używany do sortowania, prawie na pewno spowoduje dodatkową operację sortowania (prawdopodobnie na dysku) i może zmienić metodę planisty zapytań na szersze atakowanie zapytania .