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

[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. Subplot 多合一显示

    1.均匀图中图 matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. 使用import导入matplotlib.pyplot模块, 并简写成plt ...

  2. 洛谷P1576||最小花费||dijkstra||双向建边!!

    题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 数据范 ...

  3. postma概念与使用

    Postman是google开发的一款功能强大的网页调试与发送网页HTTP请求,并能运行测试用例的的Chrome插件.Postman作为一个chrome的插件,你可以打开chrome,在chrome ...

  4. angularjs ng-bind-html的用法总结

    angular中的$sanitize服务. 此服务依赖于ngSanitize模块.(这个模块需要加载angular-sanitize.js插件) 要学习这个服务,先要了解另一个指令: ng-bing- ...

  5. 使用kbmmw 的REST 服务实现上传大文件

    我们在使用kbmmw的REST 服务时,经常会下载和上传大文件.例如100M以上的.kbmmw的rest服务中 提供标准的文件下载,上传功能,基本上就是打开文件,发送,接收,没有做特殊处理.这些对于文 ...

  6. beego笔记

    beego学习笔记一:创建第一个beego Web项目 Go语言beego框架快速搭建体验五分钟讲解01 beego框架图文简介五分钟讲解02 beego框架图文简介五分钟讲解03-go语言简单方式操 ...

  7. cosfuture logs

    1,RESTClient用于调试接口的插件 2, PHP_AUTH_USER如何发送 $a = base64_encode("username:password"); 注意中间是冒 ...

  8. oracle odbc mysql 字段不全

    主要是字段集不对,mysql的字符集默认设置为utf8,odbc才是unicode编码连接,无法转发.选择ansi连接方式即可.

  9. gitlab 之 cicd

    1.使用 docker 安装 gitlab docker run -d  --hostname gitlab \        --env GITLAB_OMNIBUS_CONFIG="ex ...

  10. poj1164 The Castle

    有一个n*m的城堡,由一个个小房间组成,每个房间由一个零和四面的墙组成,每个房间都有一个价值, 价值的计算方式是:west_walls价值为1,north_walls价值为2,east_walls价值 ...