记一次线上bug:请求入参没有trim()导致查询失败

现象:对外提供的api接口,但是某一天查询接口突然出现了异常。
原因:查询到库里面的数据存在空格,而代码中有将数据转换成Map的处理,存在空格的数据为key,导致无法查询到。
解决方案:

  1. 使用sql查询数据库中存在多少存在该字段存在空格的数据。
select x_id from x_table where LENGTH(x_id) <> LENGTH(TRIM(x_id))

然后使用update语句来进行修改。

update x_table set x_id = TRIM(x_id)  where LENGTH(x_id) <> LENGTH(TRIM(x_id))
  1. 在代码中对字段新增trim()处理。

思索:为什么库中的字段存在空格,但是查询语句中的字段不存在空格,依旧可以查到这条记录?

答:官方文档上说是MySQL校对规则属于PADSPACE,对CHAR和VARCHAR值进行比较都忽略尾部空格

推荐阅读更多精彩内容