問題描述:
找出用戶名id為’AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h‘的用戶的數據:
select * from usertable where id = 'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h';
結果出現兩條記錄。
這就奇怪了,id已經設置為主鍵,怎麼會重復呢?難道是mysql的漏洞。
後來發現原來查詢出來的兩個id的值是不同的,詐一看沒什麼區別,仔細看你會發現這兩個id只是有一個字母的大小寫不同, 這兩個id分別為:
'AAMkADExM2M5NjQ2LWUzYzctNdFkMC1h',
'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'.
mysql查詢時,存在不區分大小寫的情況。可以通過binary關鍵字加以解決。
解決方法有兩種:
第一種:在建表時加以標識
create table table_name { id varchar(32) binary; }
第二種:讓mysql查詢時區分大小寫
select * from usertable where binary id = 'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h';
在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)