处理三方数据要小心,以防掉入坑中难以自拔。
最近在做一个数据核验的工作,从三方平台拿到数据(CSV文件)。将其导入数据库以便与底层数据进行比对,然而在执行SQL语句时却发现查不到内容,显然超出了预期。
具体问题如下:
使用该条语句能够查到结果
select * from t1 where t1.`主订单编号` = 4818838755045564053
使用本条数据查不到结果
select * from t1 where t1.`主订单编号` = "4818838755045564053"
说明:t1.主订单编号
的数据类型为text
。我使用的工具是Navicat,其在执行查询语句是会自动进行类型转换;换句话说:SQL中传入的参数是数字还是字符串都不会影响查询结果。所以理论上来说以上两条语句是等价的,但是实际运行结果却完全不同。
于是开始排查问题所在,首先想到问题应该是出在t1这个表上面,可能是因为“主订单编号”中包含了一些不可见的控制字符导致的。
- 先是将三方给的CSV文件进行详细检查了一遍,发现“主订单编号”的值确实存在一个莫名的空格,而且可以删除。然后又到数据库中查看,果然根据该CSV文件导入进来的t1表也是同样的问题。
- 使用replace函数将数据进行替换
update t1
set `主订单编号` = replace(`主订单编号`," ","");
replace(String,str1,str2)函数可以将String中出现的所有str1字段全部替换成str2字段
- 修改过之后就发现可以进行正常查询了
尤其是在处理三方给过来的数据时,可能数据不是很干净,会包含一些控制字符给我们带来麻烦;因此我们在进行数据校验时一定要仔细,遇到问题理性分析。