Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 08:28:35.670000
|
|
|
Cykooz
Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
|
Народ, случайно никто не сталкивался с неправильной сортировкой строк в Ubuntu с установленной локалью ru_RU.UTF-8? У меня получается вот такой парадокс ' 1' < '10' < ' 2' (в строках ' 1' и ' 2' вначале стоит один пробел). Похоже в ubuntu неправильная таблица LC_COLLATE для ru_RU.UTF-8, потому как если установить LC_COLLATE=en_EN.UTF-8, то сортировка становится правильной (правда на русских символах не проверял). Вот пример из консоли: cykooz@cykooz-pc:~$ cat ./data.txt
1
2
10
cykooz@cykooz-pc:~$ cat ./data.txt | sort
1
10
2
cykooz@cykooz-pc:~$ export LC_COLLATE=en_EN.UTF-8
cykooz@cykooz-pc:~$ cat ./data.txt | sort
1
2
10
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 14:26:53.800000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Сделай так:hexdump -C data.txt И убедись что содержимое файла именно такое, как ты видишь в текстовом редакторе. А потом будем думать ;)
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 14:37:26.893333
|
|
|
Cykooz
Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
|
cykooz@cykooz-pc:~$ hexdump -C data.txt
00000000 20 31 0a 20 32 0a 31 30 0a | 1. 2.10.|
00000009 Как видно коды символов идут в порядке возрастания и следовательно сортировка должна выполнятся правильно, но… Вообщето эту проблему я заметил попытавшись сделать в Postgresql сортировку таблицы по полю, которое содержит как раз подобные строки. Единственное на что я могу сейчас грешить, дак это на таблицу LC_COLLATE.
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 15:07:27.796666
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
ппц, сортируются же строки, а не числа. Для чисел нужен алгоритм натуральной сортировки. orb@orbuntu:~$ cat sort.txt | sort
1
10
2
orb@orbuntu:~$ cat sort.txt | sort -g
1
2
10
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 15:35:58.446666
|
|
|
Cykooz
Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
|
quote:
ORIGINAL: oRb ппц, сортируются же строки, а не числа. Конечно сортируются строки. Но если я не ошибаюсь, то строки сравиниваются посимвольно, но как в таком случае пробел (в строках ' 1' и ' 2') может быть одновременно и меньше и больше, чем символ '1' (в строке '10')
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 16:23:17.446666
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
ok, тогда man sort видим quote:
*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values. делаем orb@orbuntu:~$ export LC_ALL=C
orb@orbuntu:~$ cat sort.txt | sort
1
2
10
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 17:20:54.046666
|
|
|
Cykooz
Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
|
quote:
ORIGINAL: oRb orb@orbuntu:~$ export LC_ALL=C Если уж так и делать, то лучше LC_COLLATE=C, покрайней мере все остальные настройки локали (даты, числа и др) остануться русскими. Но по моему это не выход, не уверен что при этом будет правильная сортировка русских букв. Я ведь почему думаю на таблицу LC_COLLATE для локали ru_RU.UTF-8 - потому что во FreeBSD 6.3 есть проблема с сортировкой русских букв и решается она заменой таблицы LC_COLLATE на правильную. Дак почему же в Ubuntu не может быть подобного косяка? PS: пробывал вставлять export LC_ALL=C в скрипт запуска демона Postgresql, но это ничего не изменило в методе сортировки им строк.
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-05 08:55:01.176666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Мдя. Действительно сортирует как-то странно… По-моему просто sort игнорит пробелы в начале. Как её убедить что игнорить не надо, и как это зависит (и зависит ли?) от LC_COLLATE я не знаю. Можно покопать проблему глубже, а можно попробовать сказать-таки "export LC_COLLATE=C", или сортировать как числа, или заменить пробелы на нули, или ещё какое-нибудь решение проблемы придумать. ps. точно-точно. таблицы верны. пробелы игнорятся. `sort -z' сортирует как ожидается. это не баг, это фича ) pps. а возвращаясь к аналогичной проблеме в postresql, могу посоветовать лишь одно – ковырять postresql на предмет того, по каким принципам эта СУБД сортирует строки.
|
|
|
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-05 09:43:46.973333
|
|
|
Cykooz
Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
|
quote:
ORIGINAL: rgo … По-моему просто sort игнорит пробелы в начале. Такое ощущение что он вообще их игнорит, и не важно вначале или в конце они. Вот пример: cykooz@cykooz-pc:~$ cat ./data.txt
1 1
1 2
110
cykooz@cykooz-pc:~$ cat ./data.txt | sort
1 1
110
1 2
А Postgresql для сравнения строк использует системные функции, поэтому сортировка в нём зависит от настроек системы.
|
|
|
|
|