問(wèn)題描述
最近工作上遇到一個(gè)坑魏铅,有測(cè)試同事在MySQL上造測(cè)試數(shù)據(jù),在給一個(gè)varchar的字段賦值時(shí)坚芜,在字符串尾部多輸入了一個(gè)空格览芳。而我的代碼在利用這個(gè)字段做查詢時(shí),又會(huì)把這一個(gè)帶空格的數(shù)據(jù)給查了出來(lái)鸿竖,導(dǎo)致后面測(cè)試的一系列問(wèn)題沧竟。
比如有一張users表:
id(varchar) | username(varchar) |
---|---|
1 | test |
2 | test (尾部帶一個(gè)空格) |
sql語(yǔ)句:
select * from users where username = 'test'
此時(shí)會(huì)將id為1、2的兩條user表數(shù)據(jù)都查詢出來(lái)缚忧。這種情況悟泵,當(dāng)遇到需要生成一個(gè)key為username,value為user的hashmap時(shí)闪水,就會(huì)出現(xiàn)不可預(yù)知的bug糕非。
問(wèn)題原因
MySQL 校對(duì)規(guī)則屬于PADSPACE,針對(duì)的是 varchar char text …… 等文本類(lèi)的數(shù)據(jù)類(lèi)型球榆,會(huì)忽略尾部空格峰弹。
此為 SQL 標(biāo)準(zhǔn)化行為,無(wú)需要設(shè)置也無(wú)法改變芜果。
解決方法
1鞠呈、在查詢sql中使用like關(guān)鍵字
select * from users where username like 'test'
2、使用BINARY
select * from users where username = BINARY'test'