2015-06-30 30 views
12

Wystarczy spojrzeć, proszę:PostgreSQL sortowania cyrylicznych "ь"

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) daje mi ten wynik:

# | tok 
---+----- 
1 | а 
2 | ча 
3 | чль 
4 | чла 
5 | чь 
6 | ь 
(6 rows) 

Oto wiersze 1, 2, 5 i 6 są posortowane prawidłowo ("Ń" idzie za "а"), podczas gdy wiersze 3 i 4 są posortowane nieprawidłowo ("" następuje po "ь").

Wszystkie litery są cyrylicą, sprawdziłem wiele razy.

proszę, co się dzieje i jak to obejść (

UPDATE. Jest to błąd, który został ustalony w nurcie ostatnio: https://sourceware.org/bugzilla/show_bug.cgi?id=17293

Update2. Pamiętaj moje własne odpowiedzi poniżej

+0

Jaki jest kodowanie bazy danych? Wydaje się, że to ma znaczenie ... –

+0

@TagirValeev Kodowanie: UTF8, Układanie: uk_UA.UTF-8 (oba, jak pokazano w pgadmin3). – brownian

+3

PostgreSQL używa kolejności ustawień narodowych z systemu operacyjnego. Jeśli użyjesz narzędzia 'sort' z wiersza poleceń z tym samym sortowaniem i tymi samymi danymi, wypiszesz tę samą kolejność. –

Odpowiedz

3

Więc rozwiązania została zakończona w tych krokach:

  1. Szukano Internetu i http://linux.org.ua/ wszelkich informacji; znaleziono http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
  2. Ulubione w zgłoszeniu błędu: https://sourceware.org/bugzilla/show_bug.cgi?id=17293, stałe 2015-05-26
  3. sprawdzone glibc wersję (2.19 teraz)
  4. chwycił poprawkę; edytowany plastra (usunięcie sekcji z Makefile)
  5. Wspierany /usr/share/i18n/locales/uk_UA górę
  6. Patched to [cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff --- następnie bez --dry-run.
  7. locale-gen
  8. service postgresql restart
7

PostgreSQL polega na sortowaniu regionalnym systemu operacyjnego:

Zobacz, jak Ubuntu 14.04 sortuje tę listę:

 
# 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 
а 
ча 
чль 
чла 
чь 
ь 

W komentarzach podaję, że jest inny, ale to, co tu dostaję, jest dokładnie w tej samej kolejności, co zapytanie.

Rzeczywiście чль występuje przed чла co intuicyjnie jest dziwne, ale nie wiem, cyrillic.

Możesz przyjrzeć się /usr/share/i18n/locales/uk_UA w celu zdefiniowania ustawień narodowych i przedstawić go jako błąd ubuntu w pakietach locales.

+0

Dziękuję, naprawdę: https://sourceware.org/bugzilla/show_bug .cgi? id = 17293. Sprawdzę wszystko. – brownian