达梦数据库-学习-24-不同环境相同SQL执行结果不同分析(COMPATIBLE_MODE参数导致)

目录

 

一、环境信息

二、背景

三、分析过程

1、数据层分析

2、数据库参数层分析

四、分析总结

五、建议及改进


 

一、环境信息

名称
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。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值