Autor Zpráva
Cakewalk
Profil
Dobrý den,
mám na vyhledávání použito toto:

if ($src_details['search_description'] == 1)
        {
            $query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*') 
                OR (a.description REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*'))";        
        }
        else 
        {
            $query[] = "(a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*')";                    
        }

Potřeboval bych, aby při vyhledávání nebyla rozlišována diakritika a velká a malá písmena.
Vygooglil jsem dost metod, ale pohnul jsem pouze s velkými písmeny, ale s diakritikou ne.
Kódování je UTF-8.

Uměl by někdo tento kód upravit?

Děkuji.

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
CZechBoY
Profil
co přesně ti nefunguje?
pokud si dám na sloupec kodování utf8_czech_ci tak mi to řadí normálně jak jsem zvyklej: c, potom č
Cakewalk
Profil
Díky za reakci. No jde o to, že když dám vyhledávat název zboží např. Ústřední topení, tak musím zadat přesně název včetně diakritiky a velkých písmen. Potřeboval bych, aby to vyhledávalo bez závislosti. Např. tedy: ustredni topeni i ústřední topení atd.
Tori
Profil
Cakewalk:
Použijte jiné porovnávání - utf8_general nebo _unicode, rozdíl mezi nimi se týká hlavně řazení znaků jako Æ,ø,ğ. Viz srovnávací tabulky (utf8_czech_ci, utf8_general_ci, utf8_unicode_ci).
Jinak by myslím bylo podstatně rychlejší použít fulltextový index na prohledávaných sloupcích a funkci MATCH (sloupec) AGAINST (hledaná slova).
Cakewalk
Profil
Hezká rada, ale v podstatě nechápu, jak to udělat. Na netu jsem našel spoustu rad s použitím strtr a strtolower. Když do svého kódu přidám strtr, nedělá rozdíly ve velkých a malých písmenech, což mne teda zaskočilo, protože na to je strtolower, ale je to tak.
Nešlo by do toho mého kódu jen něco připsat, ať to nedělá rozdíly. Nechce se mi předělávat celou funkci vyhledávání?
Tori
Profil
Cakewalk:
Teď mluvíte o vyhledávání bez ohledu na velikost písmen? Vzhledem k [#1] („pohnul jsem pouze s velkými písmeny, ale s diakritikou ne. “) jsem myslela, že to vám už funguje. Záleží to na porovnávání (collation), které je nastavené pro ten sloupec - cokoliv_ci znamená bez rozlišování velikosti, cokoliv_cs velikost rozlišuje.
Nicméně, v manuálu se u fce REGEXP píše „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.
(= např. utf-8) 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.“ Jestli je opravdu problém s velikostí písmen, tak převod vstupu na malá písmena nepomůže, protože byste musel zajistit malá písmena i v DB. Osobně bych to přepsala pro fulltextové vyhledávání, které tyhle problémy nemá, ale třeba vám ještě někdo poradí jiný způsob.
Cakewalk
Profil
Aha, díky za reakci. Toto jsem netušil. Jak bych to měl tedy předělat do fulltextového vyhledávání? V adminu tohoto systému mám nastavené fulltextové vyhledávání, ale zjevně to nedělá, to co bych chtěl.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0