最近在联调某个业务时发现使用的签名总是验证不过,该业务根据如用户名userName后加了空格依然能够根据userName查询到结果 。即
select * from user where username = "asdf" 与 select * from user where username = "asdf " 的 效果是一致 。
问题是:为什么在DB查询条件中的字符串包含空格也可以查到实际没有包含空格的这条记录呢?
原因如果字段是char或varchar类型,那么在字符串比较的时候MySQL使用PADSPACE校对规则,会忽略字段末尾的空格字符 。
官方手册说明(5.0版本):http://dev.mysql.com/doc/refman/5.0/en/char.html
11.1.6.1. The CHAR and VARCHAR Types
All MySQL collations are of type PADSPACE. This means that all CHAR, VARCHAR, and TEXT values in MySQL are compared without regard to any trailing spaces. “Comparison” in this context does not include the LIKE pattern-matching operator, for which trailing spaces are significant.
解决方法方法1:使用like语句;
select * from table where user like 'abcdefg ';
方法2:使用binary类型;
select * from table where user = BINARY 'abcdefg ';
方法3:再添加一个length()条件;
select col from table where col = 'a ' and LENGTH(col) = LENGTH('a ')
【mysql查询条件字段值末尾有空格也能查到数据问题】
推荐阅读
- MySQL性能指标实时监控--awk命令实现
- MySQL连表Update修改数据
- MySQL数据库的SQL预处理技术,优化数据库必备
- 梦见好多小蜜蜂咬我 周公解梦大全查询蜜蜂咬我
- 天猫资质要求 2018年天猫入驻条件
- 4大方法教你查询手机号绑定过哪些平台,网友:太实用了
- MySql 三大知识点,索引、锁、事务,原理分析
- MySQL基于GTID的多线程同步方案
- 11条MySQL规范,你知道的有几个? Java架构师追风 2019-08-28 16:36:08
- MySQL索引原理