Pogčedajte punu verziju : MySQL case insensitive?
srdjevic
07. 04. 2007., 06:47
Kako je skoro napomenuto (http://devprotalk.com/showthread.php?t=2718) da se podsticu zanimljive teme, setih se i ja jedne. :-)
Iskusni vuci ovo verovatno znaju, ali evo za one koji nisu:
Komparacija stringova sa operaterom "=" je case-insensitive u MySQL-u jos od verzije 3.23.neke!
Dakle, upiti:
SELECT * FROM tabela WHERE stringPolje = 'nesto';
SELECT * FROM tabela WHERE stringPolje = 'NESTO';
vracaju isto!
Nekada davno imao sam koshmar sa autentikacijom korisnika zbog ovoga... :1027:
Pa eto za buduca pokolenja... ;-)
moras da naznacis da je polje case sensitive: COLLATE latin1_general_cs
CREATE TABLE `test` (
`testString` VARCHAR( 128 ) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL
) TYPE = MYISAM
neki insert:
INSERT INTO `test` ( `testString` )
VALUES ('dpt' ), ('DPT');
mysql> select * from test;
+------------+
| testString |
+------------+
| dpt |
| DPT |
+------------+
2 rows in set (0.00 sec)
mysql> select * from test where testString='dpt';
+------------+
| testString |
+------------+
| dpt |
+------------+
1 row in set (0.00 sec)
kao sto vidis, radi.
prilikom autentifikacije za passworde koristi md5 - nema boli glava.
srdjevic
07. 04. 2007., 09:37
Bravo kodi (eto vuka)! Eto, sad imamo i resenje. :1043:
Inace, nekada davno problem uopste nije bio u lozinkama (gde stoji opaska za MD5()), vec u tome da tabela sa UNIQUE KEY `username` nije dopustala unos vrednosti koje nema u bazi... :1074:
bluesman
07. 04. 2007., 10:44
Najjednostavniji nacin, bez collation, je da koristis BINARY. Cak ne moras VARCHAR polje da oznacis kao BINARY, dovoljno je da u upitu napises:
SELECT * FROM tabela WHERE BINARY stringPolje = 'nesto';
SELECT * FROM tabela WHERE BINARY stringPolje = 'NESTO';
Ako je korisnik uneo 'nesto', za prvi slucaj nadje, za drugi ne nadje, za 'NESTO' je obrnuto, a za 'Nesto' ili 'NeStO' nece naci nista.
vBulletin® v3.6.8, Copyright ©2000-2024, Jelsoft Enterprises Ltd.