Сортировка PostgreSQL с помощью кириллицы " ь"
просто взгляните, пожалуйста:
WITH toks AS (
SELECT tok
FROM
unnest('{ь, а, чь, ча, чль, чла}'::text[]) AS tok
ORDER BY tok COLLATE "uk_UA"
)
SELECT ROW_NUMBER() OVER() AS "#", tok FROM toks
ORDER BY tok COLLATE "uk_UA"
PostgreSQL 9.3 (ubuntu) дает мне этот результат:
# | tok
---+-----
1 | а
2 | ча
3 | чль
4 | чла
5 | чь
6 | ь
(6 rows)
здесь строки 1, 2, 5 и 6 сортируются правильно ("ь" идет после "а"), а строки 3 и 4 сортируются неправильно ("а" идет после "ь").
все буквы кириллицы, я проверял так много раз.
пожалуйста, что не так и как можно обойти .(
обновление: это ошибка, которая была исправлена в мейнстрим в последнее время: https://sourceware.org/bugzilla/show_bug.cgi?id=17293
обновление 2: обратите внимание на мой собственный ответ ниже.
2 ответов
PostgreSQL использует локаль операционной системы для сортировки.
смотрите, как Ubuntu 14.04 сортирует этот список:
# locale-gen uk_UA.UTF-8 Generating locales... uk_UA.UTF-8... done Generation complete. # cat >file ь а чь ча чль чла # LC_ALL=uk_UA.UTF-8 sort file а ча чль чла чь ь
в комментариях вы говорите, что это разные, но то, что я получаю здесь, точно в том же порядке, что и ваш запрос.
действительно чль
перед чла
что интуитивно странно, но я не знаю кириллицы.
вы можете посмотреть /usr/share/i18n/locales/uk_UA
для определения языкового стандарта и выведите его как ошибку ubuntu locales
пакеты.
Итак, решения были завершены в следующих шагах:
- поиск в интернете и http://linux.org.ua/ для любой информации; найдено http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
- снялся в отчете об ошибке:https://sourceware.org/bugzilla/show_bug.cgi?id=17293, исправлено 2015-05-26
- проверил
glibc
версия (2.19 теперь) - схватил патч; отредактировал патч (удален раздел для
Makefile
) - поддержал
/usr/share/i18n/locales/uk_UA
до - залатал его
[cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff
--- тогда без--dry-run
. locale-gen
service postgresql restart