本地正常的DB2查询在远程Unix服务器返回空结果集的原因排查
针对本地运行SQL有结果、远程Unix服务器通过JDBC返回0的问题,结合DB2与Java环境特性,常见诱因如下:
日期参数的时区/格式问题
本地与远程服务器时区不一致是最常见原因。比如本地用东八区(UTC+8),服务器用UTC时区,当传入本地时间(如2024-05-20 00:00:00),服务器会转换为UTC时间(2024-05-19 16:00:00),若数据库中所有datecreation记录都晚于该时间,就会返回0。另外,Java代码绑定日期参数时若用错类型(比如直接传字符串而非java.sql.Date/Timestamp),也可能导致服务器解析出不符合预期的日期值。DB2 JDBC驱动版本差异
本地与服务器的DB2驱动版本不匹配,可能导致SQL语法解析逻辑不同。比如旧版本驱动对NOT IN的字符串匹配规则、(A OR B) AND C的运算符优先级解析存在差异,甚至对WITH UR的支持有区别,最终导致过滤条件失效,返回空结果。字符集/编码不兼容
远程服务器Java环境的字符集(如file.encoding)与本地不同,比如本地用UTF-8、服务器用ISO-8859-1,会导致typedemande、codedomaff这类字符串字段匹配出现乱码。例如'42S'在服务器端被解析为乱码,使得NOT IN和IN条件都无法命中,最终无符合条件的记录。参数绑定错误
检查Java代码的参数绑定逻辑:是否正确绑定了datecreation < ?的占位符?是否误传入了错误的日期值(比如设为1970年这类极早的时间)?即便无报错,参数值不符合预期也会直接导致过滤后无数据。数据库会话属性差异
本地连接与远程JDBC连接的会话属性可能不同,比如CURRENT LOCALE LC_TIME(影响日期比较规则)、CURRENT PATH等。虽然SQL指定了edm.tdemande的schema,但部分会话属性仍可能影响条件判断逻辑。此外,若JDBC连接配置强制了更高隔离级别,可能覆盖WITH UR设置,虽一般不会直接返回0,但可排查确认。
内容的提问来源于stack exchange,提问作者Jefferson Faustin

