Saya memiliki Postgres 9.4.4 yang berjalan di Debian dan saya mendapatkan ORDER BY
perilaku berikut :
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)
Dan uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Namun, di iMac saya, dengan Postgres 9.3.4, saya mendapatkan yang berikut:
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)
Dan 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
Saya bingung oleh mengapa versi Debian tampaknya tidak sensitif huruf besar dan versi OS X tidak. Apa yang saya lewatkan, atau informasi lain apa yang perlu saya berikan?
Pembaruan : Di Mac saya, pg_collation
tabel menunjukkan saya memiliki en_US.UTF-8
susunan, tetapi di Debian, saya memiliki en_US.utf8
susunan. Jadi, di Mac saya:
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)
Dan di 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)
Jadi en_US.UTF-8
dan en_US.utf8
punya berbagai macam pesanan?
postgresql
collation
Curtis Poe
sumber
sumber
'D d a A c b CD Capacitor'
tidak dilemparkan sebagaitext
bidang pada Mac? Yaitu, cobaSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
dan lihat apa yang terjadi ...select * from pg_collation
kotak Debian menunjukkan memilikien_US.utf8
, sedangkan OS X milikien_US.UTF-8
. Menggunakan mereka untuk secara eksplisit memaksa collation pada kotak masing-masing menunjukkan urutan berbeda :(Jawaban:
Tidak, keduanya sama, hanya konvensi penamaan yang berbeda.
Ya kamu benar. Ini adalah perilaku default di Mac. Collations tidak berfungsi pada OS BSD-ish (termasuk OSX) untuk
UTF8
encoding.Berikut ini adalah referensi untuk membuktikan bahwa:
Masalah dengan urutan pengurutan (lokal UTF8 tidak berfungsi
Seperti yang dikatakan a_horse_with_no_name , Postgres menggunakan implementasi collation dari OS. Tidak ada cara untuk mendapatkan hasil yang sama di kedua sistem operasi.
Dalam kasus Anda Anda mungkin (saya katakan mungkin) lakukan seperti ini:
ORDER BY lower(fieldname)
.sumber
ORDER BY function()
pada hasil yang berpotensi besar - karena menghentikan indeks yang digunakan untuk pengurutan, itu hampir pasti akan menyebabkan operasi pengurutan ekstra (mungkin pada disk) dan dapat mengubah metode perencana kueri untuk menyerang kueri Anda secara lebih luas .