Oracle/TD/MySQL兼容模式下查询结果不一致
问题现象
某业务场景中有两套集群环境,在数据量一致的情况下,对比发现两套环境执行相同的SQL语句但执行结果不同。
- 该场景中使用的语法可以简化为以下逻辑:
1 2 3 4
CREATE TABLE test (a text, b int); INSERT INTO test values('', 1); INSERT INTO test values(null, 1); SELECT count(*) FROM test a, test b WHERE a.a = b.a;
- 两套环境中的执行结果分别如下:
结果1:
1 2 3 4 5
demo_db1=> SELECT count(*) FROM test a, test b WHERE a.a = b.a; count ------- 0 (1 row)
结果2:
1 2 3 4 5
demo_db2=> SELECT count(*) FROM test a, test b WHERE a.a = b.a; count ------- 1 (1 row)
原因分析
GaussDB(DWS)支持Oracle、Teradata和MySQL数据库兼容模式。
在TD/MySQL兼容模式下,空和NULL是不相等的,在ORA兼容模式下,空和NULL是相等的。因此上述场景可能是因为两个环境中数据库的兼容性模式设置不一致导致。
可通过查询PG_DATABASE系统表确认数据库的兼容模式:
1
|
SELECT datname, datcompatibility FROM pg_database; |
处理方法
数据库的兼容模式在CREATE DATABASE时由DBCOMPATIBILITY参数指定。
- DBCOMPATIBILITY [ = ] compatibility_type
指定兼容的数据库的类型。
- 取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。
为解决DATABASE的兼容性模式问题,需要将两个数据库的兼容模式修改为一致。GaussDB(DWS)不支持ALTER方式修改已有数据库的兼容模式DBCOMPATIBILITY,只能通过新建数据库的方式来指定兼容模式。
1 2 |
CREATE DATABASE td_db DBCOMPATIBILITY ='TD'; CREATE DATABASE |
GaussDB(DWS)不同兼容模式下Oracle、Teradata和MySQL语法行为会有一些差异,具体的差异内容可参考Oracle、Teradata和MySQL语法兼容性差异。