Сортировка 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 пакеты.


Итак, решения были завершены в следующих шагах:

  1. поиск в интернете и http://linux.org.ua/ для любой информации; найдено http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
  2. снялся в отчете об ошибке:https://sourceware.org/bugzilla/show_bug.cgi?id=17293, исправлено 2015-05-26
  3. проверил glibc версия (2.19 теперь)
  4. схватил патч; отредактировал патч (удален раздел для Makefile)
  5. поддержал /usr/share/i18n/locales/uk_UA до
  6. залатал его [cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff --- тогда без --dry-run.
  7. locale-gen
  8. service postgresql restart