目录
一、环境信息
名称 | 值 |
DM版本 | 1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Version: 12 5 Gsu level(5) cnt: 0 |
二、背景
客户反馈达梦数据库在不同环境不同版本执行相同SQL:
SELECT * FROM ELEVATORIOT.WB_DEVICE_PARAMETERS eb
WHERE eb.SYDWDM <> '' and eb.SYDWDM is not NULL;
测试库可以正常出结果,生产库不能出结果。
三、分析过程
1、数据层分析
虽然生产环境和测试环境数据有一定差异,但有一部分数据是一致的,且是满足过滤条件,但生产库根据字段SYDWDM没有滤出数据,说明不是数据的问题。
2、数据库参数层分析
生产环境COMPATIBLE_MODE参数为2表示:部分特性兼容ORACLE。
测试环境COMPATIBLE_MODE参数为0表示:不兼容其他数据库。
参数名 | 参数含义 | 值 | 描述 |
COMPATIBLE_MODE | 是否兼容其他数据库模式。 0:不兼容。 1:兼容 SQL92 标准。 2:部分兼容 ORACLE。 3:部分兼容 MS SQL SERVER。 4:部分兼容 MYSQL。 5:兼容 DM6。 6:部分兼容 TERADATA。 7:部分兼容POSTGRES | 2 | 认为空字符串和NULL等价,SYDWDM <> ''这个过滤条件会转化为SYDWDM <> NULL,任何与 NULL 的直接比较(包括 =、<>、>、< 等)都会返回 UNKNOWN,而非 TRUE 或 FALSE。所以生产环境查询结果为空。 |
0 | 认为空字符串和NULL不等价,SYDWDM字段存的都是非空字符串,所以测试环境有查询结果。 |
参数COMPATIBLE_MODE的具体信息,可以参考之前写的博客《达梦数据库-学习-19-兼容ORACLE相关参数介绍》。
四、分析总结
本次查询不一致的主要问题是:
生产环境和测试环境COMPATIBLE_MODE参数有差异,导致问题的发生。
五、建议及改进
名称 | 描述 |
方法一 | 不调整SQL,将生产环境的COMPATIBLE_MODE参数置为0,然后重启生产环境的数据库服务。 |
方法二 | 由于字段SYDWDM没有存储空字符串,所以SELECT * FROM ELEVATORIOT.WB_DEVICE_PARAMETERS eb WHERE eb.SYDWDM is not NULL;和原SQL是等价的,需在应用中嵌入此SQL。 |