Autor Zpráva
osoba
Profil *
Zdravím, mám problém s kódováním a nevím vlastně kde.

php scripty mam uložené jako UTF8, kódování stránky je UTF8, kódování sloupce v databázi mám UTF8, MySQL charset je UTF-8, a přesto když zavolám z PHP pomocí mysql_query insert, vloží se mi do tabulky misto napr. Céline slovo CĂŠline, ktere pak pomocí LIKE nejde nijak vyhledat ...

Chapu že takhle na dálku asi nevíte kde je chyba, ale netušíte alsespoň, kde by mohla být? předem děkuji...
Alphard
Profil
zkoušel jste set names 'utf8'?
osoba
Profil *
alphard: aha, to funguje, dekuji ... nejde to nejak nastavit v databazi "univerzalne", abych to nemusel delat po kazdem pripojeni?
osoba
Profil *
Tak pořád mám problém...

mám tabulku "filmy", chci v ní najít film "děkujeme, že kouříte", tohle query

SELECT * FROM `filmy` WHERE `jmeno1` LIKE "%děkujeme, že kouříte%"


funguje dobře (najde mi správný řádek tabulky), stejně jako tohle

SELECT * FROM `filmy` WHERE `jmeno1` LIKE "%dekujeme, že kouříte%"


(změna je v prvním ě)
ale tohle (změna je ž->z)

SELECT * FROM `filmy` WHERE `jmeno1` LIKE "%dekujeme, ze kouříte%"


už nenajde vůbec nic. Verze mysql je 5.0.44, není u mě ale na hostingu, takže novou verzi nenainstaluju, ale myslím že tím to nebude... ale nemám tušení, čím to být může. COLLATION je utf8_czech_ci.
osoba
Profil *
a taky jsem zjistil, že
SELECT 'ě' = 'e' COLLATE utf8_czech_ci;

vrátí 1, zatímco
SELECT 'ž = 'z' COLLATE utf8_czech_ci;

vrátí 0 ... takže je asi fakt chyba na straně mysql..?
osoba
Profil *
no ... každopádně jsem to "obešel" - nakonec nepoužívám LIKE, ale REGEXP, a místo každého e nebo ě strčím do vyhledávacího řetězce [eěé]... takže nakonec ta věc ze začátku vypadá nějak takhle

SELECT * FROM `filmy` WHERE `jmeno1` REGEXP ".*[dď][ěeé]k[uúů]j[eéě]m[eéě], [zž][eéě] k[oó][uú][rř][ií][tť][eéě].*",


přičemž ten první řetězec si na ten reg. výraz převedu přes PHP ... ano, supluju tím tak něco, co mi MySQL slibuje že umí, ale neumí, ale co se dá dělat :/
osoba
Profil *
tak oprava, nefunguje ani to ... ach jo
osoba
Profil *
aha, tak už to mám (omlouvám se za záplavu zpráv)
takhle to funguje

SELECT * FROM `filmy` WHERE `jmeno1` RLIKE ".*(d|ď)(ě|e|é)k(u|ú|ů)j(e|é|ě)m(e|é|ě), (z|ž)(e|é|ě) k(o|ó)(u|ú|ů)(r|ř)(i|í)(t|ť)(e|é|ě).*"


ono totiž mysql nepovažuje "ž" v regulárním výrazu za jeden znak
DoubleThink
Profil *
Řešit tohle regulárem je nesmysl. Lepší bude odstranit příčinu, ukládat a selectovat texty v databázi se správným kódováním.
SET NAMES utf8
SET CHARACTER SET utf8
-- případně ještě
SET COLLATION_CONNECTION = 'utf8_czech_ci'
bohyn
Profil
Zkus to znova vlozit do databaze s nastavenym utf-8 kodovanim
Kajman_
Profil *
osoba
Pro řazení v češtině má být ž za z. Pro vyhledávání by se mohlo hodit nějaké jiné provnání

SELECT * FROM `filmy` WHERE `jmeno1` LIKE "%dekujeme, ze kouříte%" COLLATE utf8_general_ci
osoba
Profil *
aha, tak co píše Kajman_ je správně, myslel jsem že ...czech_ci znamená že ž=ž, š=s atd. a ono je to přesně naopak... takže přehození COLLATION ve sloupečcích na ..general_ci to spravilo

ale ten šílený regulární výraz funguje taky!! :)

děkuju moc za rady
Toto téma je uzamčeno. Odpověď nelze zaslat.

0