MySQL i sortowanie z polskimi znakami

Dzisiaj podczas wysyłania próśb do autorów zaprzyjaźnionych blogów dotyczących zmiany anchora mojego linku natrafiłem (a raczej natrafiliśmy razem z Marcinem Łuniewskim) na problem natury technicznej. Otóż okazało się, że WordPress tak pięknie obecnie wspierający UTF8 i domyślnie korzystający z takiego właśnie kodowania znaków, nie sortuje wcale umieszczonych linków alfabetycznie, choć o takim sposobie nas informuje. Linki zawierające na początku polskie znaki zostają umieszczone na samym końcu, co też oznacza, że “wyrzuca” je poza znany mu alfabet. Skoro wszystko jest kodowane w UTF8 to sprawa wydawała się bardzo dziwna, dopóki nie przyjrzałem się strukturze tabeli oraz samej bazy WP – domyślna metoda porównywania napisów to utf8_general_ci, a niestety okazuje się, że general wcale nie oznacza wszystkie, a poza tym właśnie w collocation zawarte są dane dotyczące alfabetu używanego do sortowania. Zgodnie z przewidywaniami, zmiana metody chociażby na tylko jednym polu od nazwy na utf8_polish_ci problem zupełnie rozwiązała. Dobrze będzie wiedzieć na przyszłość, ponieważ takie sortowania wykonuje się jednak dosyć często, a dane na polskich stronach mogą przecież zawierać nasze znaki narodowe.

7 thoughts on “MySQL i sortowanie z polskimi znakami

  1. No tak, zauważyłem, że spadłeś na sam dół listy, ale nie przyglądałem się, że według alfabetu nie powinno tak być. :D

  2. dane na naszych stronach mogą zawierać także inne znaki, spoza grupy utf-8 polish

    te reguły porównywania powinny być nieco lepiej zaprojektowane :(

  3. W sumie nieco ciężko się dziwić, bo skoro wrzucimy sobie np. polskie i niemieckie znaki, to które mają mieć "wyższy priorytet"? Ostatecznie wychodzi na to, że zdecydować musimy my, podczas tworzenia struktury tabel.

  4. Ustawienie collation dla pola w bazie danych na utf8_unicode_ci powinno załatwić sprawę w przypadku "międzynarodowych" aplikacji. Można się wgryźć bardziej w szczegóły

  5. niestety nadal tagi mam posortowane źle – ustawiłem dla tabeli _terms oraz jej kolumn collation na utf8_polish_ci ale nie przyniosło to efektu.

    Od jakiej jeszcze tabeli to zależy?

  6. dla potomnych: wordpress wykorzystuje do sortowania tagów w wp_tag_cloud() funkcję strnatcasecmp(), która nie potrafi sortować polskich znaków!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.