Autor Zpráva
Jan Fabo
Profil *
Dobry den,

pracujem na vyhladavacom skripte na svojej stranke a narazil som na jeden problem: mam hladany vyraz "tkac" a chcem z tabulky z urciteho pola vytiahnut vsetky zaznamy ktore tomuto vyrazu zodpovedaju, ale aj s diakritikou a case-insensivitou, tzn. aby mi vratilo zaznamy "tkac", Tkac", "Tkáč" a podobne kombinacie.
Na strankach intervalu som sa docital, ze na riesenie tohto problemu potrebujem pouzit REGEXP v selecte. tak som vytvoril vytvoril funkciu na transformaciu vstupu na reg vyraz a vytvoril som select:
select * from tabulka where pole1 regexp "^[t,T][k,K][a,á,ä,A,Á,Ä][c,C,č,Č]$"

takto vytvoreny select nenajde vobec nic, takze uprava:
select * from tabulka where pole1 regexp "[t,T][k,K][a,á,ä,A,Á,Ä][c,C,č,Č]"

a sice neviem preco tam netreba ^ a $, ale tento nejake zaznamy vrati. bohuzial nefunguje to na 100%. ako server pouzivam mysql v5 a cela databaza je kompletne v utf-8 a collation utf8_slovak_ci. ako som sa neskor docital, tak regexp v sql query vraj nie je bezpecny na multibyte znakove sady a moze sposobit necakane vysledky. co sa mi aj deje.
Skusal som aj select s podmienkou like %tkac%, ale toto tiez nefunguje na 100% a vracia mi aj vysledky, ktore vyraz neobsahuju. co vsak bol prekvapeny, tak niektore specialne znaky to zoberie ale napr č nejde vobec.

a preto sa chcem spytat: ako vy riesite taketo vyhladavanie, ked vstupny vyraz je bez diakritiky ale do vysledok budu zahrnute aj zaznamy s diakritikou? moze byt aj link, ale uz som vygooglil asi 30 stranok a ani jedna mi nedala uspokojivu odpoved, preto sa radsej pytam priamo vas, odbornikov. za radu dakujem.

Jan Fabo
Jan Fabo
Profil *
no tak som to vyriesil, neviem preco, ale zdali sa mi ze takuto variantu som uz skusal a nesla :O
select * from tabulka where pole1 like "%tkac%" collate "utf8_general_ci"

tak toto mi staci presne na to co potrebujem, funguju vsetky znaky ako treba. zatial. :) ale predsa len, ak sa niekomu hodila konverzna funkcia z vyrazu na regularny vyraz, tak tu je

  function TextToRegtext($text)
  // funkcia prekonvertuje vstupny text po jednom znaku tak ze vzhlada vstupny
  // znak v $sources a do vystupu zapise jeho ekvivalent z $replace. Ak znak nenajde
  // do vystupu zapise zdrojovy znak
  {
    $sources = array("aáäAÁÄ","bB","cCčČ","dDďĎ","eéeëEÉEË",
                     "fF","gG","hH","iIíÍ","jJ","kK","lĺľLĹĽ",
                     "mM","nN","oóöôOÓÖÔ","pP","qQ","rŕřRŔŘ",
                     "sšSŠ","tťTŤ","uúuüUÚUÜ","vV","wW","xX",
                     "yýYÝ","zžZŽ");
    $replace = array("[a,á,ä,A,Á,Ä]","[b,B]","[c,C,č,Č]","[d,D,ď,Ď]","[e,é,e,ë,E,É,E, Ë]",
                     "[f,F]","[g,G]","[h,H]","[i,I,í,Í]","[j,J]","[k,K]","[l,ĺ,ľ,L,Ĺ,Ľ]",
                     "[m,M]","[n,N]","[o,ó,ö,ô,O,Ó,Ö,Ô]","[p,P]","[q,Q]","[r,ŕ,ř,R,Ŕ,Ř]",
                     "[s,š,S,Š]","[t,ť,T,Ť]","[u,ú,u,ü,U,Ú,U,Ü]","[v,V]","[w,W]","[x,X]",
                     "[y,ý,Y,Ý]","[z,ž,Z,Ž]");  
    $regtext = "";
    for ($j = 0; $j < mb_strlen($text,'UTF-8'); $j++)
    {
      for ($k = 0; $k < count($sources); $k++)
      {
        $Decoded = false; 
        if (mb_stristr($sources[$k], mb_substr($text,$j,1,'UTF-8')) != false)
        {
          $regtext = $regtext.$replace[$k];        
          $Decoded = true;
          break;
        }     
      }
      if (!$Decoded)
      {
        $regtext = $regtext."[".mb_substr($text,$j,1,'UTF-8')."]";
      }      
    }
    return $regtext."";  
  }

a vlastne ak sa vam chce, mozete mi napisat co si o tom myslite...:)

Jan Fabo
Sipi
Profil *
Zdravim pan Fabo,

presne s touto otazkou sa momentaalne pasujem :) ... tiez by som bol rad keby vystup z databazy po dotaze na "caj" bol aj zaznam kde sa vyskytuje "čaj".

Skusal som Vasu radu:
select * from tabulka where pole1 like "%tkac%" collate "utf8_general_ci"

ale zial - slova s diakritikou mi to nevyhlada :(

myslel som si ze to bude premennymi v mysql a nastavil som ich nasledovne:
character_set_client latin1
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results latin1
character_set_server utf8
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci


Neviete mi prosim poradit kde by mohol byt problem?

Dakujem

Peter
Kajman_
Profil *
Problém bude v
character_set_client latin1

Nastavte si po připojení set names.
http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=28&topic=3 7836
Sipi
Profil *
Zdravim Kajman_

Dakujem za pomoc ... skuusil som vela kombinacii nastaneni premennych ale nikdy sa mi nepodarilo dosiahnut "character_set_client utf8"
skuusal som:
SET NAMES 'utf8';
set global collation_connection=utf8_general_ci;
set global collation_server=utf8_general_ci;
set global character_set_results=utf8;


ale akonahle zadaam:
set global character_set_client=utf8_general_ci;

vysledok je:

character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_results latin1
character_set_server latin1
character_set_system utf8
collation_connection latin1_swedish_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci


skusal som editovat my.cnf:
[client]
default-character-set=utf8

[mysqld]
init-connect='SET NAMES utf8'
default-character-set=utf8

[mysql]
default-character-set=utf8


asi som zvolil nespravny priistup :( - najprv by to trebalo dobre pochopit ... netusil som ze je to takaa veda :)

ak by ste mali nejaky naapad - budem vdacny

Peter
tankista
Profil *
ahoj,

mne tvoj sposob velmi pomohol, pouzivam sice postgresql ale v podstate ide o to iste, len namiesto vyrazu regexp treba dat ~* a ide to bez problemov. Podobne aj funkcia funguje ok..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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