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.

Subscribe
Notify of
guest

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

7 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Lisu
Lisu
10 years ago

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

Soul Reaver
Soul Reaver
10 years ago

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 :(

littledesign
littledesign
10 years ago

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

frn303
frn303
9 years ago

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?

frn303
frn303
9 years ago

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