Я установил Postgresql 12 как на Windows, так и на Linux CentOS 8.
Для моего проекта мне нужно было создать собственную сортировку ICU и применить ее ко всем символьным столбцам (либо при создании столбца, либо в порядке запросов = предпочтительно).
Прежде чем сделать это, я попытался сделать простой тестовый пример, чтобы проверить, работает ли он так, как ожидалось... и это не так.
Простая таблица с некоторыми числовыми и буквенными данными
DROP TABLE IF EXISTS TBL;
CREATE TABLE TBL ( TEXT1 CHARACTER(5), TEXT2 CHARACTER(5) );
INSERT INTO TBL VALUES
('aaaaa', 'aaaaa')
,('aaaaa', '00000')
,('aaaaa', 'bbbbb')
,('aaaaa', '11111')
,('bbbbb', '22222')
,('00000', '22222')
,('ccccc', '22222')
,('11111', '22222');
Сопоставление для упорядочивания цифр после латинских символов из официальной документации https://www.postgresql.org/docs/12/collation.html
CREATE COLLATION digitslast (provider = icu, locale = 'en-u-kr-latn-digit');
CREATE COLLATION digitslast (provider = icu, locale = 'en@colReorder=latn-digit');
Sort digits after Latin letters. (The default is digits before letters.)
Запросы на тестирование
1/ SELECT * FROM TBL;
2/ SELECT * FROM TBL ORDER BY TEXT1, TEXT2;
3/ SELECT * FROM TBL ORDER BY TEXT1 COLLATE digitslast;
4/ SELECT * FROM TBL ORDER BY TEXT2 COLLATE digitslast;
5/ SELECT * FROM TBL ORDER BY TEXT1 COLLATE digitslast, TEXT2 COLLATE digitslast;
6/ SELECT * FROM TBL ORDER BY TEXT2 COLLATE digitslast, TEXT1 COLLATE digitslast;
Результаты в Windows = сопоставление вообще не работает
1/ OK = TEXT1 + TEXT2 = digits before letters
2/ OK = TEXT1 + TEXT2 = digits before letters
3/ KO = TEXT1 + TEXT2 = digits before letters
4/ KO = TEXT1 + TEXT2 = digits before letters
5/ KO = TEXT1 + TEXT2 = digits before letters
6/ KO = TEXT1 + TEXT2 = digits before letters
Результаты на Linux Centos 8 = сопоставление работает только для 1-го столбца из ORDER BY
1/ OK = TEXT1 + TEXT2 = digits before letters
2/ OK = TEXT1 + TEXT2 = digits before letters
3/ OK = TEXT1 = digits after letters + TEXT2 = digits before letters
4/ OK = TEXT1 = digits before letters + TEXT2 = digits after letters
5/ KO = TEXT1 = digits after letters + TEXT2 = digits before letters
6/ KO = TEXT1 = digits before letters + TEXT2 = digits after letters
Если я применил предложение COLLATE к столбцам таблицы, оно также не работает.
ICU 53 упакован для всех установок Postgresql 12, а аргумент --with-icu присутствует в конфигурации Postgresql.
Кто-нибудь знает, как заставить этот простой тестовый пример работать?
Существует предложение расширения для ICU с https://postgresql.verite.pro/blog/2018/07/25/icu-extension.html.
- Это расширение добавляет некоторые функции, которые, возможно, работают лучше, чем стандарты Postgresql.
- Нужно ли мне добавить его из исходного кода Postgresql и скомпилировать мою собственную версию Postgresql, чтобы сделать его пригодным для использования?
Другая связанная проблема не имеет ответа для Postgresql 10: Как я могу использовать Сортировка Postgres в ОС Windows?
Связанные записи из блога Postgresql