[megoldva] sql öő üű rendezési kérdés

Éppen egy kisebb adatbázissal játszok és nem akarja jól rendezni pl. az öő betűket. (persze az üű sem jó, minden ékezet a jól jelenik meg)
A lekérdezés: SELECT * FROM `iranyitoszamok` WHERE telepules like 'kő%' order by telepules asc eredménye nem éppen az, amire számítok.

Ezt kapom:
Köblény
Köcsk
Kökény
Kőkút
Kölcse
Kölesd
Kölked
Kömlő
Kömlőd
Kömörő
Kömpöc
Körmend
Környe
Köröm
Kőröshegy

Holott csak a következő kellene, hogy legyen:
Kőkút
Kőröshegy

A tábla és mezők egybevetése:
utf8_hungarian_ci
valamint a kliens php szkriptben szerepel:

mysql_query('SET character_set_results="UTF8"', $db_link);
mysql_query("SET CHARACTER SET UTF8", $db_link);
mysql_query("SET NAMES 'UTF8'", $db_link);

Valaki már találkozott ilyennel?
Mi lehet a megoldás?

Update:

Nem akartam szórakozni semmilyen mező kódolásával elegáns megoldást kerestem, hát létrehoztam egy collate file-t.

A latin2 collate file-t módosítottam. Bár még tesztelés alatt van. De elsőre működik.

A fájl letölthető innen.

Ahhoz hogy működjön be kell tenni /usr/share/mysql/charsets és szerkeszteni kell az Index.xml fájlt. Meg kell keresni a latin2_hungarian_ci sort és utána be kell rakni a collate hivatkozást:

< collation name="latin2_hungarian_ci" id="21" order="Hungarian"/ >
< collation name="latin2_hungarian_strict_ci" id="220" order="Hungarian"/ >

Az ID=220 nem biztos hogy stimmel, meg kell néznünk milyen nem használt id van a rendszerünkön és annak megfelelőt adni neki.

(SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;)
Majd be kell állítani a megfelelő mezőre és már működik is.

Már csak azt nem tudom, hogyan lehetne ezt a sorrendet uft8-hungarian alá betenni...

Hozzászólások

Collation-t kellene beallitani, tippre, e kulcsszo korul keresgelnem a megoldast.

--
|8]

Pont az a baj, hogy hungarian_ci-t használsz egybebevetésre. Ez ugyanis a karakterekre mondja meg a kisebb/nagyobb/egyenlő relációk közül melyik teljesül. Mivel a magyar helyesírás szabályai szerint rendezésnél a rövid magánhangzók és a hosszú magánhangzók egyenértékűek, ezért a MySQL számára ö == ő. Ezért kapod ezt az eredményt. Használj utf8_general_ci-t, ha azt akarod, hogy a szűrésed jó legyen (hiszen két különböző Unicode karakter az ö és ű), de ekkor a rendezés nem lesz a magyar nyelv szabályainak megfelelő.
http://mek.niif.hu/01500/01547/01547.pdf
14/d pont.

Dirty hack itt: http://pastebin.com/G7hagQqf

Használat:

$bekodolt = convert_vowel($szo,"in");

A $bekodolt értéket kell letárolni a MySQL táblába, fontos, hogy a mező ne legyen szám!

$kikodolt = mb_ucfirst(convert_vowel($mysql_kiolvasott_ertek,"out"));

Valószínű, hogy nem a legszebb megoldás, de jelen helyzetre működik.
Amit még nem volt időm megnézni, az a keresés, de a keresett stringet bekódolva lehet keresni is, a logika szabályai szerint.

Kimenet részlet:

Kövegy
Köveskál
Kőröshegy
Kőröstetétlen
Kőszárhegy
Kőszeg
Kőszegpaty
Kőtelek
Kulcs
Kunadacs

--
Coding for fun. ;)

Ez így nem dirty hack, mert nem a problémát oldja meg. A kérdésfelvetés nem azért volt, mert a mysql_hungarian_ci nem a magyar nyelv szabályai szerint rendez (aszerint rendez), hanem az, hogy számára a WHERE feltételben is egyenlő az ő meg az ö, a user kapott vissza olyan sorokat a DB-ből, amit nem várt volna, pl. Kökény is matchel arra, hogy LIKE "Kő%", pedig nem ez a szerző szándéke. Nem a sorrenddel van itt a gond, hanem az egyenlőségvizsgálattal. A dirty hacked nem oldja meg, hogy ilyenkor az eredetileg is K17-et tartalmazó stringeket ne listázza a DB.

Persze. Ez a megoldás tetszik a legjobban és saját collation-on töprengek, kibővítem itt: /usr/share/mysql/charsets a latin2.xml-t

Ez tűnik a legelegánsabb megoldásnak, mivel nem kell konvertálgatnom az adatbázist, hanem csak megfelelő collate fájlt kell csinálnom és be kell rakni az előbb említett helyre. Még csak újra sem kell fordítani a mysql-t.

Mivel kis adatbázisról van szó, nem kell hiper-szuper teljesítmény-optimalizáció.

Frantique javaslata végül nem jön be mivel konvertálni kell a tartalmat és phpmyadminnal nehezen szerkeszthető...

--
Alex