今天在测试遇到一个问题,前台点击页面查询数据时报错:

[Error Code: -420, SQL State: 22018]  DB2 SQL Error: SQLCODE=-420, SQLSTATE=22018, SQLERRMC=DECFLOAT, DRIVER=4.18.60

根据sqlcode查询错误原因为:-420 22018 字符串自变量值不符合函数的要求

查询语句大概如下:

select * from tabletest where createDate < '2018-11-17' and createStatus != 0

这个问题只在测试环境出现,于是判断是数据库的数据问题。同时在debug时还发现当使用下面这条语句时可以查询出数据,这进一步肯定了我的判断。

select * from tabletest where createDate < '2018-11-15' and createStatus != 0

但取出createDate字段时并未发现异常数据。于是转而查询表结构,发现createStatus字段是varchar类型,而这条sql语句中 createStatus != 0 ,却是将数值0与之作比较,取出字段createStatus后发现有值为空的情况,空值在自动类型转换时出错。将sql语句修改为

select * from tabletest where createDate < '2018-11-17' and createStatus != ''

顺利查出数据。

原因分析

问题解决后,我在db2和mysql数据库分别新建了一张表来复现这一问题并做深入分析。

 create table tableTest(id varchar(20) primary key not null, createDate Date, createStatus varchar(10));

 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('', '2018-11-12', '');
INSERT INTO tabletest (id, createDate, createStatus) VALUES ('', '2018-11-12', '');
INSERT INTO tabletest (id, createDate, createStatus) VALUES ('', '2018-11-13', '');
INSERT INTO tabletest (id, createDate, createStatus) VALUES ('', '2018-11-15', '');
INSERT INTO tabletest (id, createDate, createStatus) VALUES ('', '2018-11-18', '');

首先在两个数据库分别执行报错的查询语句,结果在mysql中得到了结果,而db2报错sqlcode=-420。

这就是一个很有意思的问题,可以猜测是两个数据对于空值的类型转换有不一样的定义。改用下面的查询语句:

select * from tabletest where createDate < '2018-11-17' and createStatus = 0

db2依然报错-420,而在mysql中查出了三条数据。可以看到在mysql中数据库直接将空值转换成0来做匹配。但这是一个很影响效率的做法,因为SQL命令中是用字符串跟数字0匹配,而SQLServer默认把字段中的先全部转换为数字,再来做匹配。一旦数据转换成数值时非常大的时候,还会超出范围。

综上,

  • 数据库在做查询时不是转换SQL命令中的数值为对应字段的类型,而是将数据库中的数据转换成SQL命令中的类型,不但影响效率,而且容易出错。
  • mysql会自动将空值转换成0,而db2不做任何操作。
  • 查询数据时最好使用字段相同的数据类型,否则可能查出的数据不正确。

db2 报错 sqlcode=-420 自动类型转换的问题的更多相关文章

  1. db2报错: [DB2/NT] SQL0952N 由于中断,处理被取消 SQLSTATE=57014

    DB2被中断,报错:  [DB2/NT] SQL0952N 由于中断,处理被取消 SQLSTATE=57014 在DB2的开发过程中,今日运行了一个执行时间较为长的sql语句.使用DB2服务端的控制台 ...

  2. zabbix监控vCenter报错,无法自动发现主机

    公司机房停电检修,检修完成后重新上电,发现VCSA起不来了,尝试多次无法解决,无奈只好重装.重装VCSA 6.5U2之后又发现无法自动发现主机,报错如下: 'config.vpxd.stats.max ...

  3. db2报错信息

    sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...

  4. db2报错 Operation not allowed for reason

    1.DB2数据库表操作错误SQL0668N Operation not allowed for reason code "1" on table "XXXX". ...

  5. Mybatis配置文件无故报错、无自动完成提示的解决方法,及自动生成主要配置项

    1.引子 Mybatis配置文件显示红叉有错误,而实际检查又没有错误,这是因为开发环境不能识别这种类型的xml文件.要解决这个问题,就要让IDE开发环境能够“认识”这个文件类型,我们要让IDE环境将这 ...

  6. MySQL decimal unsigned 更新负数不报错却为0

    今天在验证接口的并发问题时,把之前通过 redis 解决的并发压力转移到 mysql 上(redis 在 set 保存数据和数据过期需要去向数据库获取时存在时延,会存在空挡造成大并发多插入数据的风险: ...

  7. php报错日志:PHP Deprecated:Automatically populating $HTTP_RAW_POST_DATA is deprecated

    前几天将线上php服务升级到5.6.x版本后,php-error.log报出错误:PHP Deprecated: Automatically populating $HTTP_RAW_POST_DAT ...

  8. python 导入模块的坑。为什么整个项目能运行,单独运行某个文件模块就报错?多层目录不同文件夹怎么导入?

    一些文章介绍了python不同目录怎么导入问题,但py文件运行起点却从来没有文章说过!这是相当重要的!! 这个连接是网上99%的所讲的导入 https://www.cnblogs.com/luoye0 ...

  9. 前端vue项目部署到tomcat,一刷新报错404解决方法

    公司前端写的后台部署到tomcat webapps目录下后,无法进行刷新,一刷新就会报错404,自动跳的404页面.在网上查了下,官方说是HTML5 History 模式引发的问题,但是解决方案中,并 ...

随机推荐

  1. linux下编译protobuf(可以编译成pb.go)

    编译前需要安装gtest $ cd googletest $ cmake -DBUILD_SHARED_LIBS=ON . $ make $ sudo cp -a include/gtest /hom ...

  2. Java 日志体系(二)jcl 和 slf4j

    Java 日志体系(二)jcl 和 slf4j <java 日志体系(一)统一日志>:https://www.cnblogs.com/binarylei/p/9828166.html &l ...

  3. emmet-前端开发神器的几种写法

    *常用:类: .  ,id:  # div.a+div#a <div class="a"></div> <div id="a"&g ...

  4. ACM(图论)——tarjan算法详解

    ---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...

  5. 【Python】【BugList12】python自带IDLE执行print(req.text)报错:UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 93204-93204

    [代码] # -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'https://unsplash.co ...

  6. mac mysql5.7.17修改root初始密码(知道初始密码)

    最近在mac上装个mysql可以说是麻烦死了,在这里就说说修改初始密码吧! 刚开始的时候不知道怎么修改,于是上网百度,网上几乎都是说要先执行命令mysqld_safe --skip-grant-tab ...

  7. java 排序算法

    1.冒泡排序 public static void main(String[] args) { int[] arr={6,3,8,2,9,1}; System.out.println("排序 ...

  8. linux_基本命令使用(后续更新)

    安装文件上传下载快捷键 --> rz/sz yum -y install lrzsz 获取进程名.进程号以及用户ID netstat –nlpt 修改主机名(重启后永久生效)-->cent ...

  9. SVN用法及常见问题分析

    SVN中英文对比: 1,今天遇到的新问题,在父节点里面找不到子节点文件夹,在子节点里面可以上传但是却一直上传不上去. 具体原因:子文件夹里面有个.svn文件(打开隐藏的项目可见),是的子文件夹的svn ...

  10. Django路由分配及渲染

    一.url路由分配 1.url配置的本质是将浏览器传递过来的路径和参数与服务器中的视图向匹配,并返回浏览器相应的视图函数. 2.url路径path规则 path(route, view, kwargs ...