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...
- alexware blogja
- A hozzászóláshoz be kell jelentkezni
- 2275 megtekintés
Hozzászólások
Collation-t kellene beallitani, tippre, e kulcsszo korul keresgelnem a megoldast.
--
|8]
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Stra szintén rámutatott arra, hogy magyar és ez így helyes, ami ugye rendjén van.
Értem én, hogy magyar, mert hát ez rendjén van. A helyesírási szabályzat szintén rendben van.
De hogyan lehet megkerülni, hogy különbség <-> de mégis magyar sorrend?
--
Alex
- A hozzászóláshoz be kell jelentkezni
Sehogy. MySQL számára az egyenlőségvizsgálat ugyanonnan jön, ahonnan az összehasonlítás vizsgálat. Külön egyenlőségvizsgáló és összehasonlító rutinjai nem léteznek, ezt MySQL-en kívül, a saját szoftveredből tudod megírni.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Függvényt nem lehet használni where -ben?
- A hozzászóláshoz be kell jelentkezni
Megoldja, amennyiben:
$feltetel = convert_vowel($feltetel,"in");
$qry = "select * from adatok where adat like '$feltetel%' order by adat asc";
Kimenet nálam:
Kőröshegy
Kőröstetétlen
Kőszárhegy
Kőszeg
Kőszegpaty
Kőtelek
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Szívesen.
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
Ezt mindjárt ki is próbálom...
--
Alex
- A hozzászóláshoz be kell jelentkezni
Már ott leragadtam, hogy
"WHERE telepules like 'kő%'"-ből hogy jön ki pl. a Kőkút?
Egyébként utf8-as készelettel rögzítették a megnevezéseket?
szerk.>
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
itt azt írja, hogy az é=e feltétel igaz.
- A hozzászóláshoz be kell jelentkezni
Minden adat utf8. nem akartan szívni a latin2-konvertálásával... :)
Valamiért jobban érzem magam utf8 környezetben.
Mivel k=K, ahogy ö=ő és ahogy e=é. Ezért a lekérdezés nem érzékeny a kisbetű-nagybetű viszonyra.
--
Alex
- A hozzászóláshoz be kell jelentkezni
Amit algernon írt, megnézted?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni