trzewiczek info



17.09.2011 kod:blog
SQLite i 7-bitowe znaki
Przy okazji konkursu Wiki Lubi Zabytki chciałem szybko postawić prostą wyszukiwarkę zabytków znajdujących się w rejestrze Narodowego Instytutu Dziedzictwa. Pracując w webie zawsze działam w Django, a przy tego typu prostych i szybkich realizacjach wybieram SQLite jako bazę danych - jeden upload lokalnie, a później kopia pliku na serwer. Problemy pojawiły się, gdy okazało się, że łomża nie posiada żadnych zabytków.

Ponieważ pythonowy interfejs do SQLite jest przyjemny i bezproblemowy, wrzucenie danych zajęło chwilkę. Następnie proste filtrowanie w widoku i sortowanie wyników po województwie.

relics = Relic.objects.filter( relic_name__icontains=query ) 
              .order_by( 'voivoidship', 'poviat', 'parish' )

Proste. Szkoda tylko, że sortowanie wyników umieściło łódzkie, śląskie i świętokrzyskie na końcu listy wyników. Coś nie gra z polskimi znakami.

Nie zastanawiając się długo odpalilem seda i awka, by plik wsadowy z danymi zawierał też kolumny z nazwami województw, powiatów, gmin i zabytków bez polskich liter. Nazwy kolumn dostały dodatkowo końcówkę _slug

relics = Relic.objects.filter( relic_name__icontains=query )
              .order_by( 'voivoidship_slug', 'poviat_slug', 'parish_slug' )


Było lepiej, ale łódzkie wylądowało teraz przed lubuskim, co ma sens w świecie pozbawionym polskich znaków. Metoda na chama nie zadziałała! Co więcej okazało się, że o ile łomża nie daje żadnych wyników, to Łomża daje ich 109.

Zacząłem kombinować z djangowym slugify, ale wciąż bez rezultatów. Po kilku próbach z różnymi pomysłami znalazłem w sieci informację, że to problem z SQLite, którego niestety nie przeskoczę.

Okazało się bowiem, że wszystkie operacje z kategorii case insensitive SQLite wykonuje jedynie na 7-bitowych znakach. Dla tej bazy Ł i ł to nie wielka i mała pisownia tej samej litery, lecz dwa różne znaki. Podobnie jest z każdym innym znakiem diakrytycznym języka polskiego, francuskiego itp. Dlatego wyniki były źle posortowane, dlatego też łomża nie posiadała żadnych zabytków.

Z pomocą jak zawsze przyszedł PostgreSQL - trzydzieści minut na konfigurację, upload i zmiany, gdzie trzeba i wszystko śmiga, jak trzeba. Łódzkie jest po lubuskim, łomża ma tyle samo zabytków co Łomża, a śląskie jest przed wielkopolskim. Bawi mnie tylko, że - jak pisał autor na jednym z for - dawniej problem, o którym piszę, figurował wśród bugów SQLite, ostatnio jednak przeniesiony został do sekcji Features, jako decyzja projektowa. Słaba to decyzja w webie, który w nazwie ma World Wide...

N E W S