Как сравниваются строки при сортировке?

amiksim
Дата: 21.11.2014 23:51:52
Доброе время суток
Столкнулся с непонятной ситуацией при сортировке строк.
Пример:
select * from (select 'asd_2' union select 'asd_' union select 'asd.1') a order by 1 asc;

у меня результат такой:

?column?
----------
asd_
asd.1
asd_2
(3 rows)
вместо ожидаемого:

?column?
----------
asd_
asd_2
asd.1
(3 rows)
Такое ощущение, что игнорируются все символы, кроме букв и чисел.
В чем может быть причина такого поведения?
V&N
Дата: 22.11.2014 00:38:37
amiksim, почему ожидается . после _?
Maxim Boguk
Дата: 22.11.2014 01:00:51
amiksim,

сортировка идет в соответствии с правилами заданными используемым collation
которые зависят от операционной системы и своей внутренней логики.

Используемый в базе collation видет по выводу \l+ в psql.

Например en_US.utf8 обычно вообще при сортировке игнорирует не цифро-алфавитные символы.

--Maxim Boguk
www.postgresql-consulting.ru
amiksim
Дата: 22.11.2014 01:01:42
V&N, действительно, ошибся. должно быть так:

asd.1
asd_
asd_2
но строки с подчеркивание должны идти подряд. Вместо подчеркивания использовал другие знаки (+, -, #) - все то же самое.
тестировал на 9.4 beta2 и 9.4 beta3.
Maxim Boguk
Дата: 22.11.2014 01:02:34
amiksim
Дата: 22.11.2014 01:04:58
Maxim Boguk,
да, используется как раз en_US.utf8.
Можно как-нибудь поменять такое поведение, т.к. в строках встречаются не только цифры и буквы?
amiksim
Дата: 22.11.2014 01:32:46
Maxim Boguk
например почитайте
https://www.gnu.org/software/coreutils/faq/#Sort-does-not-sort-in-normal-order_0021

Спасибо!
если просто настроить локаль как export LC_ALL=C, то эффекта нет.
а вот если в самом запросе указать collate, то отрабатывает правильно:
select * from (select 'asd_2' as b union select 'asd_' union select 'asd.1') a order by a.b collate "C";