ugrás a tartalomhoz

mysql: ékezetfüggő LIKE

bekafej · 2008. Jan. 24. (Cs), 15.41
Sziasztok!

Van egy utf-8-as mysql problémám:
Magyar városokat szeretnék egy adatbázisból ajax-szal select option-be szűkíteni a beadott karakterek alapján (amolyan google suggest). Addig már eljutottam, hogy az ö és ő közötti különbséget feloldottam (%F6 vs %u0151 az urlencode részéről), de az adatbázisból az összes o, ó, ö, ő-t visszadja. Minden utf-8-as, keresgettem az interneten az 'accent-sensitive' kifejezésre, és mások is belebotlottak a problémába.

A probléma megoldható, sugarCRM-ben működik, de nekem egyszerűen nem megy. Nem tudom, hogy vagy mégis a karakterkódolásnál szúrtam el valamit, vagy a LIKE az ékezetfüggetlen lenne?

Minden tippet szívesen fogadok, mert reggel óta a hajamat tépem.

Köszi:
b
 
1

REGEXP?

Thoer · 2008. Jan. 24. (Cs), 16.26
Nem próbáltam ki, de próbáld meg regexp-el megkeresni amire szükséged van. Szerintem mennie kéne...

http://dev.mysql.com/doc/refman/5.0/en/regexp.html
2

BINARY

Poetro · 2008. Jan. 24. (Cs), 17.31
Ha binary módon keresel akkor csak a teljes egyezést fogja visszaadni.
http://dev.mysql.com/doc/refman/4.1/en/string-comparison-functions.html#id4421933
3

re: BINARY

bekafej · 2008. Jan. 24. (Cs), 18.04
Köszi a választ!

SQL-ben nem vagyok nagyon otthon, ezt nem értem, binárisan miért nem lehetne hasonlóságot visszaadni?

Warning

The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.


Ezért?
Különben a regexp-pel ugyanaz a helyzet, de azt a segítséget is köszönöm. És beleástam magam a sugarCRM-be, és az sem oldja meg a problémámat (oda vissza url kódolva mennek az adatok), viszont ötletet adott, amivel csúnyán, de megcsináltam (visszaadott halmazt php stristr()-rel szűkítem). Jelenleg jó, de egy korrekt megoldást azért szívesen látnék.

Üdv:
b

ps: asszem küldtem egy pn-t nem volt szándékos, sorry, túl gyorsan, túl rossz helyre kattintottam :)
4

collation?

sotetbarna · 2008. Jan. 25. (P), 17.50
a collation pont erre való szerintem

create table colltest (str varchar(20)) default character set utf8 collate utf8_bin;
insert into colltest values ('ádám');
insert into colltest values ('adam');
select * from colltest;
+------+
| str  |
+------+
| ádám |
| adam |
+------+
select * from colltest where str like '%a%';
+------+
| str  |
+------+
| adam |
+------+
select * from colltest where str like '%á%';
+------+
| str  |
+------+
| ádám |
+------+
5

re: collation

bekafej · 2008. Jan. 28. (H), 11.05
Üdv!

Ezt is próbáltam, igaz, nem utf8_bin-nel. Így is uaz.
A probléma talán az, hogy url kódoláskor - szerintem - semmilyen kódtáblában nem szerepel a karakter (persze ASCII-ben igen) ráadásul van közte több byte-os.

Egyébként
mb_internal_encoding("utf-8")
és
mb_strtolower()
használatával collation nélkül is "megy. Hiba nélkül megy, de erős php-s segítséggel, nem sima mysql SELECT-tel.

Mindenesetre köszi neked is a helpet.

Üdv:
b
6

utf8_bin a lényeg

sotetbarna · 2008. Jan. 28. (H), 12.52
utf8_bin a lényeg, pl. utf8_general_ci -vel kapod azt, hogy nem tesz normálisan különbséget 'a' és 'á' között

esetleg próbáld ki a példát, amit írtam mindkét változatban (én megtettem 5.0.32-ben, így például erősen csodálkozom ezen a kijelentéseden: "Ezt is próbáltam, igaz, nem utf8_bin-nel. Így is uaz.")
7

kipróbáltam

bekafej · 2008. Jan. 28. (H), 22.05
Természetesen kipróbáltam (elsőre nem _bin-nel, erre akartam utalni, aztán _bin-nel is), anélkül nem mondtam volna. Nem is cáfolom, hogy az általad SQL-ben bevitt sorok helyes működést adnak. Talán az én hibám, hogy nem jeleztem, nem az a, á-val bajom, hanem pl. az öő-t Őü-t, Őé-t egyszerre tartalmazó szavaknál (tehát egyszerre kisbetű-nagybetű, és urlkódban ascii és unicode egyszerre).

Vicces, de a leginkább elfogadható eredményt az utf8_hungarian_ci adta. A probléma gyökere sztem(!) ott van, ogy az a bizonyos 'a', 'á' vhogy nem akaródzik utf-8-asnak felismerődni. Mivel maga a karakterek url kódolva jönnek, utána preg_replace-szel cserélem az %[alfanum][2] és %u[alfanum][3,4] alakú karaktereket. Ami biztosan(?) jó, mert többször is ellenőriztem és sikerült közös nevezőre (utf8) hozni őket. Aztán vhol a MySQL benyeli.

Persze továbbra is nagyon lehetséges, hogy én szúrom el vhol.

Üdv:
b

ps: De, hogy érthető legyek, pl. ezt szeretném megtalálni az utf-8-as táblámban (_general_ci, _hungarian_ci, _bin, nekem mindegy): gy%u0151rs%F6v%E9nyh%E1z
8

hol van ilyen?

sotetbarna · 2008. Jan. 29. (K), 13.47
sajna akkor a problémát nem értem, van egy ilyen működő oldal, ami ilyet generál? sokkal inkább apache / böngésző / php problémának érzem, mint mysql-nek