問題描述:
找出用戶名id爲’AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h‘的用戶的數據: select * from usertable where id = 'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'; 結果出現兩條記錄。這就奇怪了,id已經設置爲主鍵,怎麼會重複呢?難道是mysql的漏洞。後來發現原來查詢出來的兩個id的值是不一樣的,詐一看沒什麼區別,仔細看你會發現這兩個id只是有一個字母的大小寫不一樣, 這兩個id分別爲:
'AAMkADExM2M5NjQ2LWUzYzctNdFkMC1h',
'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'.
原來mysql查詢時,存在不區分大小寫的狀況。能夠經過binary關鍵字加以解決。
解決方法有兩種:
第一種:讓mysql查詢時區分大小寫
select * from usertable where binary id = 'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h';
第二種:在建表時加以標識
create table table_name {
id varchar(32) binary;
}
在mysql中,存在大小寫問題的地方還有:
(1) 關鍵字: 不區分大小寫 select * fRom table_name 和 select * from table_name 效果是同樣的
(2) 標示符(如數據庫名稱和表名稱):不區分大小寫。如存在表users,那麼select * from users和select * from uSers 效果同樣。網上說這跟操做系統有關,在全部Unit操做系統(除了使用HFS+的Mac OS 以外)上都是區分大小寫的,而在windows上是不區分大小寫的。(網上的這一說法沒有驗證過,我在windows server2003上是不區分大小寫的)
(3) 表的別名:不區分大小寫 select m.* from users m where M.username = 'aa';
(4) 列的別名:不區分大小寫 select uName from (select username as uname from users where id = 768) ;mysql