Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MySQL LIKE statement

[es] :: MySQL :: MySQL LIKE statement

[ Pregleda: 2783 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

esk

Član broj: 195744
Poruke: 9
*.paleol.net.

Sajt: eshko.org


Profil

icon MySQL LIKE statement26.05.2009. u 19:34 - pre 152 meseci
Imam u odredjenoj bazi neku tabelu sa kolonama: id, username, password.

Zelim da nadjem sve korisnike koji imaju slican username i pass.

mogu uraditi sledece:
Code:
SELECT * FROM korisnici WHERE password LIKE username


Ali, prikazace mi rezultate u kojima je password = username.

Sta da uradim da mysql natjeram da provjerava redove u kojima username sadrzi password kao jedan dio ukupne vrijednosti, dakle, da ispise sve redove koji imaju slican username i password?

Primjer rezultata:
Code:

+--+--------+--------+
|id|username|password|
+--+--------+--------+
|1 |user    |34user1 |
|2 |blabla  |4blabla2|
+--+--------+--------+
 
Odgovor na temu

Jbyn4e

Član broj: 422
Poruke: 6049
*.ptt.rs.



+256 Profil

icon Re: MySQL LIKE statement26.05.2009. u 19:46 - pre 152 meseci
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html
Kad sve ostalo zakaže, pročitaj uputstvo...
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: MySQL LIKE statement26.05.2009. u 20:17 - pre 152 meseci
A zar ti u bazi password nije kriptovan sa md5 ili npr. sha1 funkcijom ? Ako nije to ti je potencijlna rupa u bezbednosti.
A ako jeste, onda ti ne vredi da uporedjuješ username i password(a i ne kapiram baš što to radiš)...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15505
*.mysql.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: MySQL LIKE statement26.05.2009. u 20:30 - pre 152 meseci
bez komentarisanja toga da se u bazi sifre cuvaju kao "plain txt" i ... i .. i ... i nadasve ... a ..


imas: LIKE sintaksu opisanu ovde: http://dev.mysql.com/doc/refma...n-functions.html#operator_like
imas REGULAR EXPRESSIONS opisane ovde: http://dev.mysql.com/doc/refma...en/regexp.html#operator_regexp
imas sve to sumirano na linku koji si vec dobio: http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

no, kapiram da umes da napises "pattern match" ne bi .... i ne bi ... i onda ... i ...

tako da.. evo ti primer za "slicnost" koji ke turbo jednostavan (dva prikazana upita su identicni):

Code:

SELECT * FROM `t1` WHERE `t1`.`username`  SOUNDS LIKE `t1`.`password`;

SELECT * FROM `t1` WHERE SOUNDEX(`t1`.`username`) = SOUNDEX(`t1`.`password`);




 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15505
*.mysql.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: MySQL LIKE statement26.05.2009. u 20:32 - pre 152 meseci
evo ti par rezultata kratkog testa:

Code:

mysql> select 'bogdan' sounds like 'bogdan';
+-------------------------------+
| 'bogdan' sounds like 'bogdan' |
+-------------------------------+
|                             1 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'bogdan123';
+----------------------------------+
| 'bogdan' sounds like 'bogdan123' |
+----------------------------------+
|                                1 | 
+----------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like '!bogdan123';
+-----------------------------------+
| 'bogdan' sounds like '!bogdan123' |
+-----------------------------------+
|                                 1 | 
+-----------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like '!bo#gdan123';
+------------------------------------+
| 'bogdan' sounds like '!bo#gdan123' |
+------------------------------------+
|                                  1 | 
+------------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like '!bo#gd$an123';
+-------------------------------------+
| 'bogdan' sounds like '!bo#gd$an123' |
+-------------------------------------+
|                                   1 | 
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like '!bo#gd$an123milos';
+------------------------------------------+
| 'bogdan' sounds like '!bo#gd$an123milos' |
+------------------------------------------+
|                                        0 | 
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'bogdanov';
+---------------------------------+
| 'bogdan' sounds like 'bogdanov' |
+---------------------------------+
|                               0 | 
+---------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'bokdan';
+-------------------------------+
| 'bogdan' sounds like 'bokdan' |
+-------------------------------+
|                             1 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'bogden';
+-------------------------------+
| 'bogdan' sounds like 'bogden' |
+-------------------------------+
|                             1 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'zogden';
+-------------------------------+
| 'bogdan' sounds like 'zogden' |
+-------------------------------+
|                             0 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'zogdan';
+-------------------------------+
| 'bogdan' sounds like 'zogdan' |
+-------------------------------+
|                             0 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select 'bogdan' sounds like 'bogidan';
+--------------------------------+
| 'bogdan' sounds like 'bogidan' |
+--------------------------------+
|                              1 | 
+--------------------------------+
1 row in set (0.00 sec)

mysql> 

 
Odgovor na temu

esk

Član broj: 195744
Poruke: 9
81.93.87.*

Sajt: eshko.org


Profil

icon Re: MySQL LIKE statement26.05.2009. u 20:47 - pre 152 meseci
Citat:
Tudfa: A zar ti u bazi password nije kriptovan sa md5 ili npr. sha1 funkcijom ? Ako nije to ti je potencijlna rupa u bezbednosti.
A ako jeste, onda ti ne vredi da uporedjuješ username i password(a i ne kapiram baš što to radiš)...

Ovaj primjer je, nothing but the example... ;)

Citat:
bogdan.kecman: bez komentarisanja toga da se u bazi sifre cuvaju kao "plain txt" i ... i .. i ... i nadasve ... a ..


imas: LIKE sintaksu opisanu ovde: http://dev.mysql.com/doc/refma...n-functions.html#operator_like
imas REGULAR EXPRESSIONS opisane ovde: http://dev.mysql.com/doc/refma...en/regexp.html#operator_regexp
imas sve to sumirano na linku koji si vec dobio: http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

no, kapiram da umes da napises "pattern match" ne bi .... i ne bi ... i onda ... i ...

tako da.. evo ti primer za "slicnost" koji ke turbo jednostavan (dva prikazana upita su identicni):

Code:

SELECT * FROM `t1` WHERE `t1`.`username`  SOUNDS LIKE `t1`.`password`;

SELECT * FROM `t1` WHERE SOUNDEX(`t1`.`username`) = SOUNDEX(`t1`.`password`);



Mnogo hvala, upalilo je ;)
Veliki pozz za sve koji su odg.
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: MySQL LIKE statement27.05.2009. u 07:12 - pre 152 meseci
Jeste da MySQL nema levenshtein distance funkciju (može kao UDF da se doda), ali možeš sve "username" i "password" (molim te nemoj ovakve primere, neki početnik će pomisliti da plain text password nije najgora greška koju ikad može napraviti) da učitaš u PHP pa u PHPu sa Levenshtein funkcijom da porediš ta dva stringa za određenu količinu sličnosti (ili to izračunaš za sve parove pa sortiraš po sličnosti, možeš lepu statistiku tako napraviti).

Problem sa soundex je što se previše oslanja na početak stringa. Što i nije problem kad se porede normalne reči (koje se stvarno i razlikuju dosta pri promeni prvog slova) ali jeste problem ako želimo da "1bogdan" bude slično sa "bogdan", ili "bogdan" i "zogdan" (oba slučaja bi imala levenshtein distance 1).
"Common sense is not so common." - Voltaire
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Humanity d.o.o.
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-3.sezampro.yu.

Sajt: www.nikolaposa.in.rs


+33 Profil

icon Re: MySQL LIKE statement27.05.2009. u 09:06 - pre 152 meseci
Evo kako bi to bilo u PHP-u:
Code:

$niz = array(
            array('username'=>'pera', 'password'=>'pera123'),
            array('username'=>'mika', 'password'=>'xyz999'),
            array('username'=>'laza', 'password'=>'123laza123'),
            array('username'=>'foo', 'password'=>'bar'),
            array('username'=>'bar', 'password'=>'1barbar1'),
            array('username'=>'foobar', 'password'=>'123456'),
        )

$novi = array();
foreach ($niz as $n) {
    if ($n['username'] != $n['password']) {
        $procenat = 0;
        similar_text($n['username'], $n['password'], &$procenat);
        
        if ((int)$procenat >= 80) {
            $novi[] = array($n['username'], $n['password']);
        }
    }
}

echo '<pre>';
print_r($novi);
echo '</pre>';

Eto ja sam tu stavio da procenat sličnosti treba da bude veći od 80%, a ti naravno sam možeš da odrediš onaj koji ti odgovara...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15505
*.mysql.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: MySQL LIKE statement27.05.2009. u 09:16 - pre 152 meseci
levenshtein() funkcija u php-u postoji i dosta je brza od similar_text() a radi istu stvar ... no odosmo sada u php ... covek je pitao kako u sql-u to da uradi ..

sto se podrske za levenshtein() u mysql-u tice, ja je ne vidim nigde ni kao feature request ... budite slobodni da odete na bugs.mysql.com i da kreirate novi bug sa "severity=feature request", napisite da bi zeleli i voleli levenshtein() funkciju... i ko zna, mozda se pojavi vrlo brzo :) (developerima je to dobar performance index - da ispunjavaju feature requests a ovaj je relativno jednostavan) ... doduse ne u 5.0/5.1 posto su GA sto znaci nema novih feature-a

ako je potreban, bilo bi prilicno jednostavno implementirati ga kao UDF ..

u svakom slucaju ja vise volem soundex za ovakve provere (ne iz baze vec inicijalno) posto ce levenstein za stringove velike razlike u velicini (bogdan i 123bog!#da$$n123) dati veliku razliku a soundex ce ih poklopiti .. tako da mi oni klasicni username123 paswordi ne prolaze ..sve u svemu i tu koristim soundex u programskom delu a ne u sql-u .. prvi put sam u sql-u otkucao soundex juce :D
 
Odgovor na temu

esk

Član broj: 195744
Poruke: 9
*.paleol.net.

Sajt: eshko.org


Profil

icon Re: MySQL LIKE statement28.05.2009. u 16:14 - pre 152 meseci
Napisao sam php skriptu koja radi taj posao na serveru, ali sam cisto htio da odradim ono sto se moze na nivou baze, na nivou baze. ;)
Hvala jos jednom svima! pozz
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: MySQL LIKE statement11.06.2009. u 01:08 - pre 152 meseci
Evo da ovde postavim pitanje, da ne počinjem novu temu...

Pravim neku vrstu pomoći za moderatore koji odobravaju ili odbijaju korisnički unos ako je sličan(radi se o vicevima),
pa sam hteo da ako ima sličnih viceva, aplikacija odmah obavesti moderatora na to, i time lakše budu izbegnuti duplikati.

Pravi mi problem ova similar_text funkcija koja zapravo radi vrhunski posao, ali je previše zahtevna.
Probao sam uporediti dva niza sa po 1000 zapisa i string vrednostima prosečne duzine 700 karaktera - rezultat smešno,očajno, kako god prelazi 3 sec nekad i više...

Sounds like i soundex mi ne rade baš posao, mada soundex nisam baš detaljno isprobao.
Zanimljiva je, a i brza ova levenshtein() funkcija (opet php sry) al' ona ima ograničenje na 255 karaktera po argumentu.

Imam ideju da uporedim prvih 255 karaktera sa levenshtein, ali koliko bi to merodavno bilo...Pomoglo bi ali ne skroz. Ili mozda da idem deo po deo, tipa prvih 255 ,sledećih 255 itd...

Ufff, znači pitanje je da li ima u mysql-u nešto što bi kol'ko tol'ko zamenilo similar_text i rešilo mi ovaj gore problem ?


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15505
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2346 Profil

icon poredjenje stringova po slicnosti11.06.2009. u 02:42 - pre 152 meseci
bolje da si otvorio novu temu :D .. ne znam kakav nam je pravilnik po pitanju "hijack threads" .. ali koliko toliko je vezano za samu temu (ne bas za njeno ime :D )

sta je fora, mysql *nema* nista bolje od soundex :( ... ti realno, vrlo jednostavno, mozes da implementiras levenshtein kao udf ali ...

Koliko se ja secam matisa, toga kako radi racunanje soundex indexa, toga kako sljaka levenshtein i jos nekoliko razlicitih funkcija .. sve one su vise manje napravljenje da mogu da porede "dve reci" a ne "dva teksta" .. ti hoces da poredis "dva teksta" te zato ovde dobijas srednje zalosne rezultate :(...

da li postoji neka gotova funkcija za poredjenje 2 teksta po slicnosti - pojma nemam, realno, tesko da postoji neka "uopstena / za svaki jezik" validna formula za to .. siguran sam da bi par ljudi koji se bave srpskom gramatikom napravili algoritam za to prilicno brzo - ali .. da se vrnemo na temu ... ono sto meni, ovako iz glave pada na pamet je da, posto imas dovoljno teksta (preko 200 bajtova) pustis furijeovu transformaciju nad oba teksta i meris razliku u koeficijentu ... sto je duzi tekst, veca je sansa da dobijes tacan rezultat ... druga stvar je da osmislis neku svoju transformaciju ... tipa, da imas "recnik" tabelu koju non stop punis recima na koje jos nisi naisao, tu bi bilo korisno ako mozes da implementiras neki stemming .. za engleski imas da skines vec gotova pravila / tabele .. za srpski je prilicno nezgodno .. onda sve sto radis je za svaki tekst izbrojis koliko ima kojih reci i onda poredis rezultate dva teksta ... ili .. ides na trulu varijantu .. pobrises sve reci krace od 3 slova, pobijes sve razmake, saberes ascii sve karaktere u tekstu i onda poredis tako dva teksta :D pa ako je razlika manja od margine ...

ono sto je najveci problem za prepoznavanje teksta je sto su tebi "SVI" tekstovi slicni ako se radi o vicevima ... svaki komplikovaniji algoritam ce ti sve viceve o muji i hasi videti kao jedan ... o plavusama kao drugi, o slovencima kao treci i slicno .. uporedi 3 vica o muji i hasi .. vec ti 30% vica trose reci mujo i haso ... dodatnih 30% trose "common" izrazi gde je ovaj zaje*o onog drugog .. i razlika je u 30% gde je "glagol" koji daje opis "kako ga je ...." ... to ce teeeeeeeeeesko bilo koji algoritam da prepozna :(

sve u svemu, mysql nema funkciju za poredjenje stringova ... ja sam pre jedno ~7 godina pravio klasifikator u javi koristeci ovu ideju sa recnikom (ili je bio php, ne secam se, nije ni bitno), i imao sam odlicne rezultate klasifikacije dokumenata (imao sam dokumente velicine 1 - 50 strana koji su se klasifikovali po jeziku, materiji, unutar raznih materija po temi i slicno .. sve u svemu drvo za klasifikaciju je imalo oko 240 nodova) gde je posle nekih 30000 klasifikovanih dokumenata (oko 90% su dokumenti vec bili rucno klasifikovani pa su samo provuceni kroz klasifikator kao "learning matrix" a 10% je dodatno rucno klasifikovano kroz aplikaciju) sam klasifikator "pogadjao" sa preko 90% tacnosti pripadnost svakoj od 240 "klasa"... tako da sam upoznat sa problemom, najveci problem je sto je tebi text
- suvise dugacak za "soundex" ili "levenshtein"
- suvise kratak za bilo sta drugo
- suvise slican

ja kapiram da pustis bazu viceva na srpskom, da kada bi uspeo da izvedes neki stemming, ne bi dobio vise od 2K unique reci za sve viceve ikad ispricane na srpskom
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: MySQL LIKE statement11.06.2009. u 14:30 - pre 152 meseci
Evo, dok sam malo istestirao, i procitao (par puta) post.
Ovo sa rečnikom mi nije palo na pamet, može biti veoma interesanto, jedino što mi je to malo previše za ovo što zelim da izvedem, ali stvarno dobra ideja...
Citat:
bogdan.kecman:
Koliko se ja secam matisa, toga kako radi racunanje soundex indexa, toga kako sljaka levenshtein i jos nekoliko razlicitih funkcija .. sve one su vise manje napravljenje da mogu da porede "dve reci" a ne "dva teksta" .. ti hoces da poredis "dva teksta" te zato ovde dobijas srednje zalosne rezultate ...

Tačno,to je bio zapravo problem, ja poredim dva manja teksta duzine recimo 700 karaktera u proseku. Zato reko hajde da dam tim funkcijama da rade ono što im je namena.

U 10000 prolaza poredeći tekst duzine 700 znakova, sa tekstovima slične duzine dobija se rezultat od 21 sec (sa similar_text).

E sad, kad sam uradio poredjenje iz delova, tipa 20 karaktera iz prvog stringa i 20 karaktera iz drugog stringa i tako redom,
rezultat je bio vise nego zadovoljavajuć - 10000 prolaza 2 sec... Iako je bilo nekoliko puta više poziva similar_text funkcije + substr rezultat je bio 10 puta bolji...

Sad još da uradim ono što si predlozio za izbacivanje reči manjih od 3 karaktera iz teksta, i da izmerim sve ovo i sa levenshtein...
Kad bih uspeo da spustim na 1 sec ... Ih ...

Eto da ne idem više u off, jer se sve tiče php-a, hvala na pomoći i predlozima !!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15505
217.24.31.*

Sajt: mysql.rs


+2346 Profil

icon Re: MySQL LIKE statement11.06.2009. u 15:46 - pre 152 meseci
ako imas da ulozis vremena, mozes da napises levenshtein kao udf pa da ga imas direkt u mysql-u ... tu direktno u implementaciji mozes da ubacis izbacivanje reci od 3 slova i manje... eventualno izbacivanje reci poput (muja, hasa, crnogorac, plavusa) .. koje su common ... i eto ti ga resenje unutar mysql-a
 
Odgovor na temu

[es] :: MySQL :: MySQL LIKE statement

[ Pregleda: 2783 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.