sql隐式转换

326 阅读2分钟

问题

公司dba反馈,说sql有隐式转换的问题,而且所有的字段都没有单引号。这样会导致没有走索引。

理论上是不可能的,因为隐式转换,只能从纯数字转换为字符串,其他数据类型互转不了,因为类型不兼容,sql都执行不了,会报错。

如果没有走索引,那么sql是非常慢的,而且每次执行都会非常慢,所以不可能没有走索引。

什么是sql隐式转换?

数据转换只会发生在字符串和数字类型。

segmentfault.com/a/119000003…

数据库客户端

没有单引号就会报错

正确

代码

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官方文档

github.com/alibaba/dru…

github.com/alibaba/dru…