问题
公司dba反馈,说sql有隐式转换的问题,而且所有的字段都没有单引号。这样会导致没有走索引。
理论上是不可能的,因为隐式转换,只能从纯数字转换为字符串,其他数据类型互转不了,因为类型不兼容,sql都执行不了,会报错。
如果没有走索引,那么sql是非常慢的,而且每次执行都会非常慢,所以不可能没有走索引。
什么是sql隐式转换?
数据转换只会发生在字符串和数字类型。
数据库客户端
没有单引号就会报错
正确
代码
hibernate
看了下代码,sql,都是hibernate框架生成的,应该没有问题。hibernate用的那么普遍,不可能有这种基本的问题。
目前整个公司,很多项目,尤其是老项目,全部都是hibernate,hibernate也不可能有这个问题。
测试环境,打印hibernate sql日志验证一下。但是打印的sql,都是占位符,即?。
mybatis
打印出来,也不是可执行sql。
基于druid,打印可执行sql
基于druid,可以打印可执行sql。
如何打印可执行sql?
打断点调试,可以看到可执行sql
把可执行sql打印出来
详细步骤
启动参数
作用
打断点可以看可执行sql,但是没有打印出来
插入和查询可以打印可执行sql,但是更新sql,没有打印可执行sql
原因
具体原因是改了common.jar的druidXXX类的构造器的入参为false
本来默认就是true,改了反而不打印可执行sql了。解决方法是设置为true。
现在可以打印更新sql的可执行sql了。
总结
最终原因是dba搞错了,dba通过sql审计工具发现sql没有单引号,误以为(dba自己人为判断)有隐式转换,其实没有。
后面找dba审计工具的厂商沟通了,应该是工具有问题,把单引号去掉了。
参考
druid官方文档