Autor | Zpráva | ||
---|---|---|---|
Jan Fabo Profil * |
#1 · Zasláno: 3. 12. 2007, 09:07:54
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 * |
#2 · Zasláno: 3. 12. 2007, 09:38:59
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 |
||
Časová prodleva: 2 měsíce
|
|||
Sipi Profil * |
#3 · Zasláno: 4. 2. 2008, 16:54:06
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 * |
#4 · Zasláno: 4. 2. 2008, 18:09:49
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 * |
#5 · Zasláno: 5. 2. 2008, 19:01:18
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 |
||
Časová prodleva: 1 rok
|
|||
tankista Profil * |
#6 · Zasláno: 9. 7. 2009, 09:38:45
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.. |
||
Časová prodleva: 15 let
|
0