MySQL 查詢不區分大小寫的問題以及編碼格式問題

2022-03-30 10:27:02 字數 2882 閱讀 1011

最近,在用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

');

在mysql中存在著各種utf8編碼格式,如下:

1)utf8_bin

2)utf8_general_ci

3)utf8_general_cs

utf8_bin將字串中的每乙個字元用二進位制資料儲存,區分大小寫。

utf8_genera_ci不區分大小寫,ci為case insensitive的縮寫,即大小寫不敏感。

utf8_general_cs區分大小寫,cs為case sensitive的縮寫,即大小寫敏感。

現在假設執行如下命令:

create table test_bin (

name varchar(

32) not null

primary key,

age

int unsigned not null

) engine = innodb collate=utf8_bin;

以上命令能夠執行成功。

create table test_ci (

name varchar(

32) not null

primary key,

age

int unsigned not null

) engine = innodb collate=utf8_general_ci;

以上命令能夠執行成功。

create table test_cs (

name varchar(

32) not null

primary key,

age

int unsigned not null

) engine = innodb collate=utf8_general_cs;

在5.6.10版本中,以上命令執行失敗,不支援utf8_genral_cs。

insert into test_bin values('

alice

', 18);

以上命令能夠執行成功。

insert into test_bin values('

alice

', 18);

以上命令能夠執行成功,因為utf8_bin是以十六進製制方式儲存資料,兩條記錄的主鍵不重複。

insert into test_ci values('

alice

', 18);

以上命令能夠執行成功。

insert into test_ci values('

alily

', 20);

以上命令執行失敗,因為utf8_general_ci不區分大小寫,兩條記錄的主鍵重複。

Django MySQL查詢不區分大小寫問題

最近發現乙個現象是測試環境的 sqlite 是可以區分大小寫的。就是說python sqlite 環境 company.objects.filter name teambition company.objects.filter name teambition 而到了線上的 mysql 就不區分大小寫...

mysql查詢不區分大小寫

摘自 當我們輸入不管大小寫都能查詢到資料,例如 輸入 aaa 或者aaa aaa都能查詢同樣的結果,說明查詢條件對大小寫不敏感。解決方案一 於是懷疑mysql的問題。做個實驗 直接使用客戶端用sql查詢資料庫。發現的確是大小不敏感 通過查詢資料發現需要設定collate 校對 collate規則 b...

MySQL查詢不區分大小寫

springboot mybatis plus獲取資料時,發現mysql竟然沒有區分大小寫都能識別出來,具體的sql如下 select from user where username mysql預設的字元檢索策略 utf8 general ci,表示不區分大小寫 utf8 general cs表示...