记一次bug,一个控台系统,系统账号是单人单号的,不允许单账号同时登录两次。某天查看redis突然发现,某个账号在redis里同时存在两个token,仔细对比后发现,key多一个个空格。去控台测试后发现,登录的账号后面加一个空格是可以登录的。于是去后台看查询账号的sql。简略如下:
select * from user where name=#{name}
这个name的的类型为varchar,经过测试后发现 入参的name后面加空格不会影响查询的结果。经过查询资料得知,mysql 对 char,varchar,text类型会校验,会忽略字符末尾的空格。
这种情况下不符合需求。解决办法有两个:
- 使用like:
select * from user where name like #{name}
使用like来代替=,这样就逐字校验。不会忽略末尾空格。
2.使用 BINARY
select * from user where name= BINARY #{name}
BINARY 会将字符强制转换为二进制进行校验。也不会忽略空格。
至此,问题解决。