起因:

组里一博士突然把我拉去解决一个数据库连接的问题,一看数据库是Access,心生不妙,这玩意从来没用过,而且也从未听说周围人有谁用的,估计教程文档会比较少

问题描述:一个比较长的SQL语句,包含变量,需要拼接起来传给python数据库驱动,但是里面包含一个模糊查询,要匹配一个浮点数的前几位,但是返回结果一直是空。

虽然本菜鸡多年不写SQL了,不过想着不就是一个string拼接嘛,不会有啥大问题,最多就是编码、数字和字符串转换什么的问题。

尝试步骤:把语句单独拿出来到Access里执行,可行(我靠,慌了,为啥

把不含like的语句在代码里执行,没问题,那问题基本在like了?

猜测是不是编码的问题,因为之前尝试中拼接字符串的时候,出错会输出语句的UTF编码格式,经过这种编码转换测试,证明不是

网上教程有说要把语句写入.sql文件,然后再读取文件的,想了一下,这个有点麻烦,没有尝试,而且string和本地读取会有啥区别(后面想这里我可能想错了

猜测,是不是数字在Access中存储会向前补全空格,导致对应不上

全网搜索,试了各种办法,无果,炸了

解决方案:access里like的通配符不能用%,要用* - DeepSky_ -

一般标准SQL里,通配符是“%”,而Access里通配符是 “ * ”,,,难搞

简而言之,写代码的时候,按照标准SQL语句来,驱动(忘了他用的是哪个驱动了)会给你转换?但是既然转换都做了,为啥会没考虑用户极有可能这里写错呢?不懂,没细看底层实现。

但是在数据库里直接操作的时候,就按数据库本身的规范做

所以现在回想,Stack Overflow上说直接读取sql文件也许是有效的,,人驱动也许是直接给你传给后台了呢。但是本人没有进行验证,因为不是问题解决了就溜了,并不想在自己机器上装Access。。。。。(反人类

题外话,选解决方案的时候,通用性还是很重要滴鸭,不然很容易连个教程都没有。。。。