Mysql varchar类型字段存储的数据末尾带空格,数据过滤不及预期问题
- 引
- 分析
引
最近在项目上遇到一个数据过滤问题,有一批数据,字段末尾多了一个空格,在最后提交的时候被java后端的equals比较校验不匹配,导致业务流程阻塞,数据来源于上游系统,发送下来的数据有问题,在我方系统有一系列的使用,可以简单理解为页面上通过指定类型去查询,查询出来的数据在最后提交的时候又提示与指定的类型不匹配。起初我以为是查询的时候缺少这个过滤条件,后查看代码发现是有这个约束的,但为何还是查询出来了呢?
分析
数据是通过Mysql查询出来的,将打印出来的sql直接搬到Dbeaver上,加上同样的过滤条件,一执行,发现还真能查询出来,及时我在=号过后的字符串后面加上再多的空格也没用。老实说,工作这么多年,也还是第一次遇到这个问题。
经查询,Mysql在字符串比较时会自动忽略掉尾随的空格,注意,是尾随,如果是在非空字符串的最前面有空格差异,是能被过滤掉的。这里我测试了多种字段排序规则,都是同样的效果。
那么,遇到这种情况又想要严格按照字符串匹配规则来过滤该怎么处理呢,可以使用binary比较,这个是最严格的,也可以通过like来进行匹配,也不会忽略空格。
- 能查询出name为
tom
的数据:
select * from user where user.name = 'tom ';
- 使用utf8mb4_unicode_ci 排序规则,亦会返回name为
tom
的数据
select * from user where user.name COLLATE utf8mb4_unicode_ci = 'tom ' COLLATE utf8mb4_unicode_ci;
- binay匹配,只会返回name为
tom
的数据(尾随空格)
select * from user where binary user.name = binary 'tom ';
- like匹配,只会返回name为
tom
的数据(尾随空格)
select * from user where user.name like 'tom ';