今天在排查线上问题时,碰到了一个很有意思的情况,相关人员在数据库内维护了一条信息,但使用Java代码进行逻辑匹配时却找不到,最后排查发现原因竟然是数据库内存储的数据中右侧含有一个空格符,过程不多说了,直接上代码:
查询一:
select * from cd_project_contrast where corporation_code = '8010' and project_code = 'SCTC'
查询二:
select * from cd_project_contrast where corporation_code = '8010' and project_code = 'SCTC '
以上两条查询语句都可以查出
但是,标红的地方明显可以看出是多一个空格的,所以我们理想的是查询一不应该查询这个结果,经过大量学(bai)习(du),找到了相关解释:
所有MySQL排序都属于PADSPACE类型。这意味着MySQL中的所有CHAR和VARCHAR值都进行比较,而不考虑任何尾随空间[...]所有MySQL版本都是如此,不受服务器SQL模式的影响。
所以以上的查询应该修改为:
select * from cd_project_contrast where corporation_code = '8010' and project_code = BINARY 'SCTC';
注意BINARY的位置,要放在字符串前,这样可以有效利用索引