Skip to content

达梦数据库之数据库兼容模式

sql 查询数据库当前兼容模式

sql
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='COMPATIBLE_MODE';

数据库兼容模式

兼容模式数值说明:

  • 0:默认(DM 原生)
  • 1:SQL92
  • 2:Oracle
  • 3:SQL Server
  • 4:MySQL

安装数据库时,在 dm.ini 文件中指定兼容模式

dm.ini 文件通常在 /home/dmdba/dmdbms/data/库名/ 或安装目录下。

比如:

  • /home/dmdba/dmdbms/data/DAMENG/dm.ini
  • /opt/dmdbms/data/DAMENG/dm.ini
ini
# 编辑这个参数(比如修改为 2 以兼容 oracle)。默认为 0
COMPATIBLE_MODE = 2

通过 dm.ini 修改兼容模式(需重启数据库服务)

和上面一样。但是修改完成后,需要重启数据库服务。

运行时通过 sql 修改兼容模式(需重启数据库服务)

登录 disql/DM 管理工具,执行:

sql
-- 设为 Oracle 兼容(静态参数,scope=2)
SP_SET_PARA_VALUE(2, 'COMPATIBLE_MODE', 2);

-- 或(SPFILE = 改配置文件,必须重启。)
ALTER SYSTEM SET 'COMPATIBLE_MODE' = 2 SPFILE;

运行时 SPFILE 修改兼容模式,需要重启数据库服务。

jdbc url 配置兼容模式

yml
# 库端:COMPATIBLE_MODE=2
url: jdbc:dm://localhost:5236?compatibleMode=oracle

数据库端 COMPATIBLE_MODE 和 JDBC 连接串 compatibleMode 的区别

对比维度服务器端 COMPATIBLE_MODE = 2客户端JDBC compatibleMode=oracle
作用范围全局,影响整个数据库实例局部,仅影响当前数据库连接
生效方式修改数据库初始化参数,需重启数据库服务修改JDBC连接字符串(URL),即时生效

数据库服务器端:COMPATIBLE_MODE 参数

  • 作用:在数据库实例级别调整其行为,以兼容特定数据库的SQL语法、函数和数据处理逻辑。
  • 配置与生效:可执行SQL ALTER SYSTEM SET 'COMPATIBLE_MODE'=2 SPFILE; 或修改dm.ini文件来配置。它是一个静态参数,修改后必须重启数据库服务才能生效。
  • 主要影响(Oracle兼容模式)
    • 空字符串('')与NULL的处理:将空字符串等同于NULL处理,与Oracle行为一致。例如INSERT INTO test VALUES('')后再用IS NULL查询,能查出该行数据。
    • SQL语法与函数:支持更多Oracle特有的语法、函数(如DECODE)、系统包(如DBMS_OUTPUT)和数据类型映射。
    • DBMS_OUTPUT.PUT_LINE输出行为:当输出NULL时显示为空,而不是字符串NULL

JDBC连接客户端:compatibleMode=oracle 参数

  • 作用:作为JDBC驱动的连接属性,在URL中直接指定,用于微调客户端驱动的行为,以适配 Oracle 应用,无需重启数据库。

  • 配置与生效:在JDBC URL中追加参数,例如:jdbc:dm://127.0.0.1:5236?compatibleMode=oracle。它即时生效,仅影响建立连接的当前会话。

  • 主要影响

    • 忽略setReadOnly(true):模仿Oracle JDBC驱动行为,忽略只读事务设置,避免应用从 Oracle 迁移后因 Spring 等框架配置导致数据修改失败。
    • 适配元数据查询:使DatabaseMetaData接口的方法(如获取存储过程列信息)返回与Oracle兼容的结果集结构。
    • 解决特定框架兼容性问题:可解决业务在备库INSERTshardingDataSource bean创建失败等兼容性报错。
    • 解决SQL语法解析异常:解决因框架(如Flowable、Liquibase)无法正确识别DM DBMS数据库类型而导致的问题。

兼容模式使用的最佳方式

数据库端设置 COMPATIBLE_MODE=2,同时 jdbc url 配置 compatibleMode=oracle。