MySQL – ORDER BY, hrvatski znakovi čćžđš i pogrešna kodna tablica
Problem:
Nekim čudom nam se zalomilo (čitaj nismo se naspavali, nismo popili kavu… ma koga ja lažem, bili smo mladi i neiskusni) da kreiramo website u neki čudnim kombinacijama kodne tablice baze podataka i stranica na kojima se nalaze formulari za upis u bazu… neke perverzne kombinacije windows 1250 i utf-8 ili nešto slično… I dobili smo nešto što kod ispisa na web stranici izgleda kao čćžđšČĆŽĐŠ, ali kad otvorimo bazu vidimo nekakve ž, Š ili slične điđabaje… I to nam se ne čini neki veliki problem jer se stvar uredno ispisuje kao hrvatski znak. No, problem nastaje kada popis toga nečega (uzmimo da je riječ o prezimenima) pokušamo poredati po abecedi… I taj nesretni Č i Ć nam nikako ne sjedne iza C, a prije D ma što napravili…
Prije nego šro se počnemo igrati nekim globalnim promjenama kolacije, kodne tablice ili sl. dobro je znati da postoji jedan jednostavan sistem kako na brzinu stvar ispisati po abecedi iako smo svjesni da nam rješenje i nije baš najelegantnije.
Rješenje:
SELECT * FROM Persons ORDER BY replace(Prezime,'Č','Cx') ASC
Ovdje smo kod ORDER BY naredbe Č zamijenili sa Cx…
budući da po abecedi Č dolazi iza C ovim načinom početno slovo svih prezimena koja počinju sa Č zamijenjujemo sa C ali mu dodajemo i x kako bi došlo na kraj popisa svih prezimena koja počinju sa C.
…(budući da x po abecedi dolazi iza ž)…
zvuči kompliciranije nego što je… ma zapravo ja neznam objasnit…
Kad bi sve hrvatske znakove željeli odjednom zamijenit na ovakav način to bi izgledalo ovako:
SELECT * FROM Persons ORDER BY replace(replace(replace(replace( replace(replace(replace(replace( replace(replace(Prezime,'č','Cxx') ,'š','Sx'),';ž','Zx'), 'đ','Dx'),'ć','Cx'),'Č' ,'Cxx'),'Š','Sx'),'Ž','Zx') ,'Đ','Dx'),'Ć','Cx') ASC