У меня Postgres 9.4.4 работает на Debian, и я получаю следующее ORDER BY
поведение:
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)
И uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Однако на моем iMac с Postgres 9.3.4 я получаю следующее:
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)
И то 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
Я озадачен тем, почему версия Debian не чувствительна к регистру, а версия OS X - нет. Что мне не хватает или какую другую информацию мне нужно предоставить?
Обновление : на моем Mac pg_collation
таблица показывает, что у меня есть параметры en_US.UTF-8
сортировки, а в Debian - параметры en_US.utf8
сортировки. Таким образом, на моем 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)
И на 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)
Так en_US.UTF-8
и en_US.utf8
есть разные порядки сортировки?
postgresql
collation
Кертис По
источник
источник
'D d a A c b CD Capacitor'
не будет использоваться в качествеtext
поля на Mac? IE, попробуйтеSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
и посмотрите, что произойдет ...select * from pg_collation
у Debian коробка естьen_US.utf8
, а у OS X естьen_US.UTF-8
. Использование их для явной принудительной сортировки в соответствующих полях показывает разные порядки сортировки :(Ответы:
Нет, они оба одинаковые, просто другое соглашение об именах.
Да вы правы. Это поведение по умолчанию на Mac. Параметры сортировки не работают ни в одной операционной системе BSD (включая OSX) для
UTF8
кодирования.Вот ссылка, чтобы доказать это:
Проблемы с порядком сортировки (UTF8 локали не работают
Как сказал a_horse_with_no_name , Postgres использует реализацию сопоставления из ОС. Невозможно получить одинаковый результат в обеих операционных системах.
В вашем случае вы можете (я , возможно , сказал) сделать так:
ORDER BY lower(fieldname)
.источник
ORDER BY function()
потенциально больших наборов результатов - поскольку это останавливает использование индекса для сортировки, это почти наверняка вызовет дополнительную операцию сортировки (возможно, на диске), и это может изменить метод планировщика запросов для более широкой атаки на ваш запрос. ,