达梦数据库之数据库兼容模式
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兼容的结果集结构。 - 解决特定框架兼容性问题:可解决业务在备库
INSERT、shardingDataSourcebean创建失败等兼容性报错。 - 解决SQL语法解析异常:解决因框架(如Flowable、Liquibase)无法正确识别
DM DBMS数据库类型而导致的问题。
- 忽略
兼容模式使用的最佳方式
数据库端设置 COMPATIBLE_MODE=2,同时 jdbc url 配置 compatibleMode=oracle。
