最近,在用ssh框架完成乙個實踐專案時,碰到了乙個莫名其妙的bug困擾了我好久,最後終於解決,記錄如下。
問題:同學在測試系統的時候突然發現,資料庫儲存的賬戶本來應該是admin,結果該同學用admin賬戶居然登入成功了…………exm???這樣也行?好吧,我還是查詢這個bug發生的原因吧。然後就是各種排查程式的過程,找來找去也沒發現什麼問題。終於想到,不用hql,自己寫sql語句在資料庫裡面直接查詢試試,結果果然發現了問題所在:
select * from
user
where username = 'admin'
and password = 'admin';
select * from
user
where username = 'admin'
and password = 'admin';
select * from
user
where username = 'admin'
and password = 'admin';
mysql預設的字元檢索策略:utf8_general_ci,表示不區分大小寫;utf8_general_cs表示區分大小寫,utf8_bin表示二進位制比較,同樣也區分大小寫 。(注意:在mysql5.6.10版本中,不支援utf8_genral_cs!!!!)
建立表時,直接設定表的collate屬性為utf8_general_cs或者utf8_bin;如果已經建立表,則直接修改欄位的collation屬性為utf8_general_cs或者utf8_bin。
-- 建立表:
create
table testt(
id int
primary
key,
name varchar(32) not
null
) engine = innodb collate =utf8_bin;
-- 修改表結構的collation屬性
alter
table tablename modify column columnname varchar(50) binary character
set utf8 collate utf8_bin default
null;
直接修改sql語句,在要查詢的字段前面加上binary關鍵字即可。
-- 在每乙個條件前加上binary關鍵字
select * from
user
where binary username = 'admin'
and binary password = 'admin';
-- 將引數以binary('')包圍
select * from
user
where username like binary('admin') and password like binary('admin');
> 部分引用自文章:
注意:在我的這次專案中用的是hibernate框架,使用的並不是sql,而是hql語句,使用from user where binary username = ? and binary password = ?;
結果報錯,再試from user where username like binary(?) and password like binary(?);
才沒有報錯。原因暫時不知。
解決MySQL查詢不區分大小寫
今天遇到乙個情況,查詢資料時查詢條件輸入不管大小寫,都能查到同樣的資料。比如 輸入 aaa 或者aaa aaa都能查詢同樣的結果,說明查詢條件是大小寫不敏感的。因為程式使用了hibernate框架訪問mysql 資料庫。一開始以為是hibernate的問題。最跟蹤了一下hibernate 沒有看到轉...
解決MySQL查詢不區分大小寫
今天遇到乙個情況,查詢資料時查詢條件輸入不管大小寫,都能查到同樣的資料。比如 輸入 aaa 或者aaa aaa都能查詢同樣的結果,說明查詢條件是大小寫不敏感的。因為程式使用了hibernate框架訪問mysql資料庫。一開始以為是hibernate的問題。最跟蹤了一下hibernate 沒有看到轉換...
mysql查詢不區分大小寫
摘自 當我們輸入不管大小寫都能查詢到資料,例如 輸入 aaa 或者aaa aaa都能查詢同樣的結果,說明查詢條件對大小寫不敏感。解決方案一 於是懷疑mysql的問題。做個實驗 直接使用客戶端用sql查詢資料庫。發現的確是大小不敏感 通過查詢資料發現需要設定collate 校對 collate規則 b...