PDA

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... ;-)

kodi
07. 04. 2007., 07:25
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.