Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка русских символом / 10 сообщений из 10, страница 1 из 1
15.08.2015, 13:05
    #39029964
spyfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
Здравствуйте!
Помогите с сортировкой - русские слова сортируются не в алфавитном порядке.

Есть табличка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
babylon=# \d country_text
   Table "public.country_text"
   Column   |  Type   | Modifiers 
------------+---------+-----------
 country_id | integer | not null
 lang_id    | integer | not null
 title      | citext  | 
Indexes:
    "country_text_pkey" PRIMARY KEY, btree (country_id, lang_id)
    "country_text_lang_id_title_idx" UNIQUE, btree (lang_id, title)
Foreign-key constraints:
    "country_text_country_id_fkey" FOREIGN KEY (country_id) REFERENCES country(country_id) ON UPDATE CASCADE ON DELETE CASCADE
    "country_text_lang_id_fkey" FOREIGN KEY (lang_id) REFERENCES lang(lang_id) ON UPDATE CASCADE ON DELETE CASCADE

Пробуем выбрать страны и отсортировать по title:

Код: sql
1.
select * from country_text where title is not null order by title;



Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 country_id | lang_id |               title               
------------+---------+-----------------------------------
        397 |       1 | США
        451 |       1 | Чад
        330 |       1 | Кот д`Ивуар
        401 |       1 | Сан-Томе и Принсипи
        458 |       1 | Шри-Ланка
        400 |       1 | Сан-Марино
        282 |       1 | Гана
        295 |       1 | Гуам
        308 |       1 | Ирак
        309 |       1 | Иран
        322 |       1 | Кипр
        331 |       1 | Куба
        335 |       1 | Лаос
        351 |       1 | Мали
        372 |       1 | Ниуэ
        377 |       1 | Оман
        389 |       1 | Перу
        428 |       1 | Того
        454 |       1 | Чили
        410 |       1 | Сент-Китс и Невис
        412 |       1 | Сент-Пьер и Микелон
...
etc

Почему??? Куда копать?

Какие переменные могут влиять на сортировку?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
babylon=# show  LC_CTYPE;
  lc_ctype   
-------------
 ru_RU.UTF-8
(1 row)

babylon=# show  LC_COLLATE;
 lc_collate  
-------------
 ru_RU.UTF-8
(1 row)
...
Рейтинг: 0 / 0
15.08.2015, 13:58
    #39029988
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
spyfox,

голубчик, а type "citext" -- это что такое ?
если что-то собственного изготовление -- то как на нём порядок задан ?
...
Рейтинг: 0 / 0
15.08.2015, 14:00
    #39029989
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
ЗЫ приведи вывод вот такой штуки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
WITH q(f) AS (SELECT 
regexp_split_to_array(trim(
regexp_split_to_table($$ 
        397 |       1 | США
        451 |       1 | Чад
        330 |       1 | Кот д`Ивуар
        401 |       1 | Сан-Томе и Принсипи
        458 |       1 | Шри-Ланка
        400 |       1 | Сан-Марино
        282 |       1 | Гана
        295 |       1 | Гуам
        308 |       1 | Ирак
        309 |       1 | Иран
        322 |       1 | Кипр
        331 |       1 | Куба
        335 |       1 | Лаос
        351 |       1 | Мали
        372 |       1 | Ниуэ
        377 |       1 | Оман
        389 |       1 | Перу
        428 |       1 | Того
        454 |       1 | Чили
        410 |       1 | Сент-Китс и Невис
        412 |       1 | Сент-Пьер и Микелон
$$,E'\n','i')
)
,E' *[\|] *','i')
)
SELECT f[1] a , f[2] b, f[3] c, ascii(f[3]) FROM q
ORDER BY f[3] --::citext

...
Рейтинг: 0 / 0
17.08.2015, 10:09
    #39030573
spyfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
qwwq,

citext - тип данных аналогичный text, но при поиске не учитывает регистр. Это офф расширение:
http://www.postgresql.org/docs/9.3/static/citext.html

Вот что выводит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  a  | b |          c          | ascii 
-----+---+---------------------+-------
 397 | 1 | США                 |  1057
 451 | 1 | Чад                 |  1063
 330 | 1 | Кот д`Ивуар         |  1050
 401 | 1 | Сан-Томе и Принсипи |  1057
 458 | 1 | Шри-Ланка           |  1064
 400 | 1 | Сан-Марино          |  1057
 282 | 1 | Гана                |  1043
 295 | 1 | Гуам                |  1043
 308 | 1 | Ирак                |  1048
 309 | 1 | Иран                |  1048
 322 | 1 | Кипр                |  1050
 331 | 1 | Куба                |  1050
 335 | 1 | Лаос                |  1051
 351 | 1 | Мали                |  1052
 372 | 1 | Ниуэ                |  1053
 377 | 1 | Оман                |  1054
 389 | 1 | Перу                |  1055
 428 | 1 | Того                |  1058
 454 | 1 | Чили                |  1063
 410 | 1 | Сент-Китс и Невис   |  1057
 412 | 1 | Сент-Пьер и Микелон |  1057
     |   |                     |      
     |   |                     |      
(23 rows)

Тут дело не в citext - я попробовал с типом text - результат такой же:
1) Табличка с типом text:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
babylon=# \d country_text_2
  Table "public.country_text_2"
   Column   |  Type   | Modifiers 
------------+---------+-----------
 country_id | integer | not null
 lang_id    | integer | not null
 title      | text    | 

2)
Код: sql
1.
select * from country_text_2 order by title;



3) Результат такой же:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
babylon=# select * from country_text_2 order by title;
 country_id | lang_id |               title               
------------+---------+-----------------------------------
        397 |       1 | США
        451 |       1 | Чад
        330 |       1 | Кот д`Ивуар
        401 |       1 | Сан-Томе и Принсипи
        458 |       1 | Шри-Ланка
        400 |       1 | Сан-Марино
        282 |       1 | Гана
        295 |       1 | Гуам
        308 |       1 | Ирак
        309 |       1 | Иран
        322 |       1 | Кипр
        331 |       1 | Куба
        335 |       1 | Лаос
        351 |       1 | Мали
        372 |       1 | Ниуэ
        377 |       1 | Оман
        389 |       1 | Перу
        428 |       1 | Того
        454 |       1 | Чили
        410 |       1 | Сент-Китс и Невис
        412 |       1 | Сент-Пьер и Микелон
        315 |       1 | Кабо-Верде
        411 |       1 | Сент-Люсия
        415 |       1 | Синт-Мартен
        409 |       1 | Сент-Винсент
        465 |       1 | Южно-Африканская Республика
        240 |       1 | Алжир
...

Что может быть?
...
Рейтинг: 0 / 0
17.08.2015, 11:09
    #39030601
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
spyfox,

сделайте \l+ в psql и пришлите результаты.
Надо посмотреть в какой кодировке и локали у вас база в которой вы работаете.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
17.08.2015, 11:53
    #39030634
spyfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
Maxim Boguk,

babylon=# \l+ babylon
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
---------+----------+----------+-------------+-------------+-------------------+-------+------------+-------------
babylon | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | | 15 MB | pg_default |
(1 row)

А может так быть, что collate у базы выставлен правильно в UTF8, а collate на connection неправильно. В результате данные в базе хранятся в неверное кодировке, отсюда и проблемы с сортировкой ?
...
Рейтинг: 0 / 0
17.08.2015, 12:55
    #39030694
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
spyfox,

Сортировка в базе не зависит от collate на connection а только от collate в самой базе (или в самом поле если collate для него переопределен как описано в: http://www.postgresql.org/docs/9.4/static/collation.html но это не ваш случай).

У меня есть теория что у вас библиотеки OS используемые базой сортируют UTF8 криво (такое бывает).
У вас случайно не FreeBSD? Если FreeBSD то при установке PostgreSQL вы ICU библиотеку случайно не отключали?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
17.08.2015, 15:22
    #39030808
spyfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
Maxim Boguk,
Спасибо за информацию! :)

У меня MacOS 10.9.5

В ближайшее время попробую залить БД на тестовый сервер и оттестировать там.

На MacOS postgresql ставил из портов. Как можно диагностировать эту проблему, а впоследствии и исправить ее?
...
Рейтинг: 0 / 0
17.08.2015, 16:22
    #39030915
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
spyfoxMaxim Boguk,
Спасибо за информацию! :)

У меня MacOS 10.9.5

В ближайшее время попробую залить БД на тестовый сервер и оттестировать там.

На MacOS postgresql ставил из портов. Как можно диагностировать эту проблему, а впоследствии и исправить ее?

Диагностировать - кривая сортировка русского текста.
Исправить - идей нет я с MacOS не работал.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
17.08.2015, 16:25
    #39030921
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка русских символом
spyfoxMaxim Boguk,
Спасибо за информацию! :)

У меня MacOS 10.9.5

В ближайшее время попробую залить БД на тестовый сервер и оттестировать там.

На MacOS postgresql ставил из портов. Как можно диагностировать эту проблему, а впоследствии и исправить ее?

Быстрый поиск в интернете привел к
"
Я работаю под Mac OS X 10.6.4. Как все нормальные люди, я пользуюсь кодировкой UTF8. Но как оказалось, кириллические данные в этой кодировке в постгресе сортируются некорректно... Сразу стало понятно, что это проблема окружения. Через некоторое время, я выяснил что правила сортировки для локали ru_RU.UTF-8 в системе просто отсутствуют... Точнее файл LC_COLLATE, в котором должны храниться эти настройки, является символической ссылкой на файл из латинской локали.
~ $ ls -al /usr/share/locale/ru_RU.UTF-8/
lrwxr-xr-x 1 root wheel 28 Sep 26 2009 LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
"

Apple жжет просто напалмом. Как впрочем и FreeBSD от которого он начинался и в котором раньше (не знаю как сейчас) была 100% таже проблема (почему я про FreeBSD и спросил).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка русских символом / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]