文档首页> 数据仓库服务 GaussDB(DWS)> 故障排除> 数据库使用> Oracle/TD/MySQL兼容模式下查询结果不一致
更新时间:2024-01-25 GMT+08:00

Oracle/TD/MySQL兼容模式下查询结果不一致

问题现象

某业务场景中有两套集群环境,在数据量一致的情况下,对比发现两套环境执行相同的SQL语句但执行结果不同。

  1. 该场景中使用的语法可以简化为以下逻辑:

    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;
    

  2. 两套环境中的执行结果分别如下:

    结果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 [ = ] compatibilty_type

    指定兼容的数据库的类型。

  • 取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。

    若创建数据库时不指定该参数,默认为ORA。

为解决DATABASE的兼容性模式问题,需要将两个数据库的兼容模式修改为一致。GaussDB(DWS)不支持ALTER方式修改已有数据库的兼容模式DBCOMPATIBILITY,只能通过新建数据库的方式来指定兼容模式。

1
2
CREATE DATABASE td_db DBCOMPATIBILITY ='TD';
CREATE DATABASE

GaussDB(DWS)不同兼容模式下Oracle、Teradata和MySQL语法行为会有一些差异,具体的差异内容可参考Oracle、Teradata和MySQL语法兼容性差异