Distinctre összevonja az ékezetes betűket a MySQL
Sziasztok!
Van ez a lekérdezés:A probléma a következő:
De nekem arr alenne szükségem, hogy mindegyik betű szerepljen az eredményben és csak egyszer.
WinXP, MySQL 4.1.13-nt,
PHPMyAdmin szerint az egybevetés: utf8_unicode_ci, Charset:UTF8, Collation: utf8_unicode_ci
Thx
TikuVoltam
■ Van ez a lekérdezés:
SELECT DISTINCT LEFT(nev, 1) AS betu FROM olvaso ORDER BY betu
Distinct
nélkül gyönyörűen megjelennek a nevek első betűi (az összes magyar ékezetes betűket is beleértve). De ha a DISTINCT
-et beleteszem, akkor az A-Á, E-É, I-I, O-Ó-Ö-Ő, U-Ú-Ü-Ű, betűket összevonja. Ha jól értelmezem a jeleket, akkor a párosokból/négyesekből az az első betű reprezentálja a többit, ami először bekerült a táblába.De nekem arr alenne szükségem, hogy mindegyik betű szerepljen az eredményben és csak egyszer.
WinXP, MySQL 4.1.13-nt,
PHPMyAdmin szerint az egybevetés: utf8_unicode_ci, Charset:UTF8, Collation: utf8_unicode_ci
Thx
TikuVoltam
pont most volt ez
tényleg :)
Lényeg a lényeg: átállítottam az oszlopot
VARBINARY
-ra meg is olddott a probléa. már nem vonja össze az ékezetes betűket.DE mint fentebb is látható nekem az összes olyan betűre van szükségem, amivel kezdődik név, (ebből a listából generálom a linkeket, amivel a teljes listát lehet szűkíteni). Ha
LEFT(nev, 1)
van a lekérdezésben, akkor az ékezetes betűk mégis összevonódnak, de már 1 karakterré.Nem mernék rá megesküdni, de arra gondolok, hogy 2 byte-on tárolódnak ezek a betűk, és ezekből is csak 1 byte-ot vesz figyelembe (Ha hülyeség akkor javítsatok ki). Azért gondolom ezt, mert, ha azt mondom, hogy
LEFT(nev, 2)
, akkor már prímán megjelennek azok a fránya magánhangzók (1 betű), de az összes többi rekordból 2 betű. A poén, ahol a név második betűje ilyen "furcsa" magánhangzó, ott megint csak a furcsa karakter jelenik megEzt valahogy ki lehet küszöbölni?
TikuVoltam
Ma is holnap fekszünk le, mint tegnap
furcsa karakterek
Ami a furcsa karaktereket illeti, az UTF8 két bájton ábrázolja a magyar ékezetes karaktereket, és ezeknek az első bájtja minden magyar karakterre ugyanaz. Úgy tűnik, hogy a LEFT() mégsem karakterekben számol, hanem bájtokban, vagy a charset nem UTF8-ra van állítva, csak annak tűnik (mondjuk tábla szinten más). Ha egyik sem, akkor dokumentáció alapján ez MySQL bugnak tűnik, és lehet hogy egy másik függvény használata segíthet (substring lekérdezés mondjuk).
úgy tünik bug
SUBSTRING
-el is ugyanaz az eredmény. ez a kódLehetne azt is, hogy a PHP-ba bedrótozom, a teljes ABC-t, de ezt nem szeretném. Az lenne az igazi, ha azok a betűk, amelyel nincsen név, nem is jelennének meg.
Hogy lehetne ezt hatékonyan és elegánsan megoldani?
TikuVoltam
Ma is holnap fekszünk le, mint tegnap
ne keverjük a PHP-t a MySQL-lel
Megoldás (?)
LEFT(nev, 2)
), és a PHP-re bízom a válogatást.Mielőtt ezt megcsináltam volna ellenőrizni akartam, hogy működik-e. Ez volt az előző magyarázata :)
A pontosítás kedvéért. Tényleg minden utf8-ra van állítva. A telepítéskor is utf8-at adtam meg defaultnak, a tábla létrehozásakor is minden utf8 volt.
Reggel, frissen (igaz még kávé nem volt) kipróbáltam a javaslatokat, és láss csodát, ez működik:
nev
szerint rendezem, akkor megint előjön az a probléma, hogy kb jó helyen jelennek meg (pl: oóöő, az n után, és a p előtt), de olyan sorrendben, ahogy a táblába bekerültek. (pl.: Ádám, előrébb van a táblában, mint Asztalos, így a kapott ABC-m így kezdődik Á,A,B).Rá lehet venni valahogy a MySQL-t, hogy a magyar ABC szerint végezze a rendezést?
TikuVoltam
Ma is holnap fekszünk le, mint tegnap
collate utf8_bin
mezőnév varchar(x) binary
vagy a tábla collate tulajdonságát állítsd utf8_bin-re.
Ellenben, ha a mezőnek varbinary tipust adsz meg, az lehet, hogy már bináris formában tárolja az adatokat és nem utf kódolással, akkor is ha a tábla beállítása utf8.