Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Čeština s háčkama a PHP + MySQL

Ahoj, vyrábím jeden web na zakázku a mám problém s mysql a vlastně i php. Odkazem přes metodu GET posílám něco takového:

sortabc.php?letter=Ř

Vznikne adresa sortabc.php?letter=%C5%A4. Když napíšu echo $_GET['letter'];, vyjde z toho Ř, ale v mysql se podle příkazu

SELECT * FROM `reviewdvd` WHERE name REGEXP '^[$letter]' ORDER by id DESC LIMIT $minlimit , $maxlimit

vytřídí písmeno Č, takhle to funguje i u ostatních. Ještě mě napadlo třídit pomocí "name like ('$letter%')", což je ale pomalejší než REGEXP a v DB bude okolo 8000 záznamů tak aby to nedopadlo jako tady na poradně, kde se vyhledává od 10 do 20 vteřin(nic proti, v DB poradny je toho fakt dost)
Takto mám udělané dělení podle abecedy. Vyzkouším to name like ..., ozvu se

Kodování stránek: UTF-8
Díky za odpovědi

Předmět Autor Datum
Takže s name like ('$letter%') to už bere písmena normálně až na některé výjimky, třeba u Ď to bere…
marekdrtic 27.07.2008 08:08
marekdrtic
Pri spojení s MySQL musíš MySQL serveru (najlepšie hneď po otvorení spojenia) povedať, že mu posiela…
los 27.07.2008 10:21
los
Ale ten uživatel už tam má namláceno 1800 záznamů, takže přidání indexu by bylo zdlouhavé. To set na…
marekdrtic 27.07.2008 10:38
marekdrtic
Pri použití LIKE sa použije porovnávanie, ktoré máš definované pre tú tabuľku, takže to môže ignorov…
los 27.07.2008 11:21
los
No teda losi, klaním se před tebou. COLLATE utf8_bin zabralo. R3SP3CT! :beer::beer::beer::beer::bee… poslední
marekdrtic 27.07.2008 11:37
marekdrtic

Pri spojení s MySQL musíš MySQL serveru (najlepšie hneď po otvorení spojenia) povedať, že mu posielaš dopyty v UTF-8 (viď dokumentácia):

set names 'utf8'

Edit: Vstup od používateľa musíš ošetriť pomocou funkcie mysql_real_escape_string.
Edit2: Keď to chceš používať na triedenie podľa abecedy, tak je lepšie na to vyhradiť jeden samostatný stĺpec, nad ktorým bude index (regulárny výraz alebo like bude pomalé, hoci pri 8000 záznamoch by to nemalo byť nič tragické).

Pri použití LIKE sa použije porovnávanie, ktoré máš definované pre tú tabuľku, takže to môže ignorovať diakritiku. Keď definuješ porovnávanie (collation) priamo v dopyte, tak by to malo fungovať:

SELECT ... WHERE ... LIKE ... COLLATE utf8_bin

Pridanie indexu by pozostávalo z pridania stĺpca typu char s porovnávaním utf8_bin, vytvorenia indexu a vykonania update, aby sa tam vložilo prvé písmeno z toho slova.

Zpět do poradny Odpovědět na původní otázku Nahoru