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

[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. /lib/lsb/init-functions

    lsb_functions="/lib/lsb/init-functions" if test -f $lsb_functions ; then . $lsb_functions

  2. Numpy安装

    Python官网上的发行版是不包含Numpy模块的. 1.使用已有的发起行版本 对于许多用户,尤其是在Windows上,最简单的方法就是下载以下的Python发行版,他们包涵了所有的关键包(包括Num ...

  3. 支付宝app对接的坑

    主要流程是: 1.申请成为开发者 2.创建应用 3.设置应用公钥/私钥/支付宝公钥 4.制作服务器端代码(此处注意,不要解析htmlencode) https://blog.csdn.net/zzzi ...

  4. net::ERR_CONNECTION_RESET 问题排查

    后台服务器代码有问题 实体不对称,导致映射不对

  5. Gym - 101848B Almost AP 暴力

    题目链接:http://codeforces.com/gym/101848/problem/B 给出一串数字要你最多改动三个数字使这一串数字成为等差数列.因为最多改动三个数字所以可以先求出相邻两项的差 ...

  6. Play中JSON序列化

    总的来说在scala体系下,对于习惯了java和c#这些常规开发的人来说,无论是akka-http还是play,就处理个json序列化与反序列化真他娘够费劲的. 根据经验,Json处理是比较简单的,但 ...

  7. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

  8. Acceptance Test - Business Readable Acceptance Test using - Specflow

    Agenda Benefits Living document Frameworks specflow supports How to integrate it in development cycl ...

  9. 20155312 张竞予 Exp 8 Web基础

    Exp 8 Web基础 目录 基础问题回答 (1)什么是表单 (2)浏览器可以解析运行什么语言. (3)WebServer支持哪些动态语言 实践过程记录 1.Web前端:HTML 2.Web前端jav ...

  10. PHP获取日期时间信息

    getdate函数 描述:可以获取日期/时间信息 语法:array getdate( [ int timestamp ] ) 返回一个数组 例: Array ( [seconds] => 30 ...