DB2 ODBC驱动将NULL浮点/整数转换为近似0值问题咨询
DB2 ODBC驱动v11.5.7中NULL值被错误转换为非空值的问题
问题现象
使用Python的pyodbc库通过ODBC连接DB2时,查询结果中的NULL值被错误转换为非空值:
- Linux环境下INT类型NULL被转为0
- Mac M1环境下INT类型NULL被转为2,REAL类型NULL被转为
4.2439915814e-314(接近0的极小值)
环境与复现步骤
启动DB2容器的Docker命令
docker run -itd --name db2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=xxxxx -e DBNAME=testdb -v <db storage dir>:/database ibmcom/db2
复现代码
import pyodbc cs = "Driver={ODBC Driver v11.5.7 for DB2};Database=xxxxx;Hostname=xxxx;Port=50000;Protocol=TCPIP;Uid=xxxx;Pwd=xxxx;" cnxn = pyodbc.connect(cs) crsr = cnxn.cursor() crsr.execute("SELECT CAST(NULL AS INT), CAST(NULL AS REAL) FROM SYSIBM.SYSDUMMY1"); print(crsr.messages) print(crsr.fetchall())
执行输出
❯ python float-test.py [] [(2, 4.2439915814e-314)]
根本原因
该问题是IBM Fix Central提供的ODBC驱动v11.5.7的已知bug,而IBM公开源的v11.5.6版本不存在此问题。
解决办法
- 回退到ODBC驱动v11.5.6版本:这是最彻底的根本解决方式,直接规避驱动本身的bug,确保NULL值能以原生数据类型返回
- 查询层面临时规避:如果暂时无法回退驱动,可在SQL查询中显式处理NULL值,例如:
注:此方法仅作为临时方案,若驱动bug本身未修复,可能仍存在异常SELECT CASE WHEN col IS NULL THEN NULL ELSE col END AS int_col, CASE WHEN col2 IS NULL THEN NULL ELSE col2 END AS real_col FROM SYSIBM.SYSDUMMY1 - 调整连接参数:尝试在连接字符串中添加
NULLABLE=TRUE参数,部分场景下可强制驱动正确识别NULL值,但对v11.5.7的bug修复效果有限
内容的提问来源于stack exchange,提问作者w08r
相关产品推荐
相关产品推荐

