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

[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不做任何操作。
  • 查询数据时最好使用字段相同的数据类型,否则可能查出的数据不正确。

最新文章

  1. CentOS 7 恢复 Windows 启动项
  2. (二)工厂方法模式-C++实现
  3. 问题解决——使用CriticalSection后 0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
  4. [LeetCode]题解(python):062 Unique path
  5. V​M​W​a​r​e​里​安​装​6​4​位​L​i​n​u​x​ ​的​方​法
  6. CVE爬虫抓取漏洞URL
  7. word2010无法打开文件时的一点对策
  8. 统一我的博客文章的CSS样式代码
  9. MongoDB数据库索引
  10. Gson序列化对象如何忽略字段
  11. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)
  12. 第二节. SignalR开篇以及如何指定传输协议
  13. JAVA配置文件/反射操作
  14. Lua + win 10 + vs2017的运行环境和创建cocos2dx 3.17的lua项目(亲测)
  15. JSP 页面显示sql中数据。el
  16. AD域自定义属性《完整》
  17. vue+vue-cli+vuex+vrouter 开发学习和总结
  18. mysql cast
  19. SqlServer添加触发器死锁的原因
  20. Java Internet

热门文章

  1. HihoCoder - 1103 Colorful Lecture Note
  2. NumPy学习_01 ndarray相关概念
  3. jmeter用Windows电脑分布式部署
  4. 常用jquery
  5. js中创建对象
  6. mac 下 tomcat7的安装
  7. Mysql常用命令 详细整理版
  8. Spring Ioc 常用注解
  9. org.apache.commons.httpclient工具类
  10. 使用kbmmw 实现图形验证码