COMPATIBLE_MODECOMPATIBLE_MODE 是 DM 中最重要的兼容性开关,位于 dm.ini 配置文件中。
| 取值 | 含义 |
|---|---|
| 0 | 不兼容(达梦默认模式) |
| 1 | 兼容 SQL92 标准 |
| 2 | 部分兼容 ORACLE 👈 |
| 3 | 部分兼容 MSSQLSERVER |
| 4 | 部分兼容 MYSQL 👈 |
| 5 | 兼容 DM6 |
| 6 | 部分兼容 TERADATA |
| 7 | 部分兼容 POSTGRES |
| 8 | 部分兼容 DB2 |
COMPATIBLE_MODE 是静态参数,修改后必须重启数据库才能生效。
当兼容模式设置为 COMPATIBLE_MODE=2 时,还需要同步调整以下参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
CASE_SENSITIVE |
Y |
Oracle 默认大小写敏感,建议保持一致 |
CHARSET |
0(GB18030) 或 1(UTF-8) |
根据源库字符集选择 |
BLANK_PAD_MODE |
1 |
兼容 Oracle 结尾空格填充规则:CHAR 类型按定义长度填充空格,VARCHAR2 不填充也不截断 |
| 参数 | 推荐值 | 说明 |
|---|---|---|
COMPATIBLE_MODE |
2 |
部分兼容 Oracle |
FLOAT_MODE |
1 |
必须与 COMPATIBLE_MODE=2 同时开启,支持浮点特殊值(NaN/Infinity 等) |
NUMBER_MODE |
1 |
兼容 Oracle 的 NUMBER/FLOAT/REAL/DOUBLE PRECISION 类型处理方式 |
ORA_DATE_FMT |
1 |
仅当 COMPATIBLE_MODE=2 时有效;DATE 类型使用 NLS_DATE_FORMAT 格式 |
ORA_REVERSE_MODE |
1 |
REVERSE() 函数按字符反转(与 DM 默认一致);0 则按字节反转(与 Oracle 一致)??? |
DATETIME_FMT_MODE |
1 |
兼容 Oracle 五种日期时间类型的默认格式 |
LEGACY_SEQUENCE |
0 |
与 Oracle 序列兼容(0 表示与 Oracle 兼容,1 表示与 DM 旧版本兼容) |
CASE_COMPATIBLE_MODE |
1 |
CASE/DECODE 运算兼容 Oracle 处理策略 |
PL_SQLCODE_COMPATIBLE |
1 |
PL/SQL 异常处理中 SQLCODE 错误码尽量与 Oracle 一致 |
VIEW_ACCESS_MODE |
1 |
视图自主访问控制兼容 Oracle |
SPACE_COMPARE_MODE |
1 |
查询语句中比较字符串后缀空格 ??? |
XA_COMPATIBLE_MODE |
1 |
XA 事务兼容 Oracle(返回与 Oracle 一致的报错码) |
CHAR_CHECK_INTEGRATED |
1 |
检查字符完整性(配合 COMPATIBLE_MODE=2) |
JSON_MODE |
0 |
JSON 语法解析兼容 ORACLE |
dminit PATH=/data/dmdata PAGE_SIZE=16 CASE_SENSITIVE=Y CHARSET=1 BLANK_PAD_MODE=1 DB_NAME=ORACLEDB INSTANCE_NAME=ORCL PORT_NUM=5236 SYSDBA_PWD=XXXXXXX SYSAUDITOR_PWD=XXXXXXX
建库后在 dm.ini 中修改/确认:
COMPATIBLE_MODE = 2
FLOAT_MODE = 1
NUMBER_MODE = 1
ORA_DATE_FMT = 1
DATETIME_FMT_MODE = 1
LEGACY_SEQUENCE = 0
PL_SQLCODE_COMPATIBLE = 1
VIEW_ACCESS_MODE = 1
当兼容模式设置为 COMPATIBLE_MODE=4 时,还需要同步调整以下参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
CASE_SENSITIVE |
N |
MySQL 默认大小写不敏感,建议保持一致 |
CHARSET |
1(UTF-8) |
MySQL 通常使用 UTF-8 字符集 |
BLANK_PAD_MODE |
0 |
MySQL 不进行 Oracle 式的空格填充 |
| 参数 | 推荐值 | 说明 |
|---|---|---|
COMPATIBLE_MODE |
4 |
部分兼容 MySQL |
CALC_AS_DECIMAL |
2 |
整数除法和四则运算转为 DECIMAL 处理(兼容 MySQL 运算规则) |
MY_STRICT_TABLES |
1 |
仅在 COMPATIBLE_MODE=4 时有效。位掩码控制严格模式:bit0-数据超长、bit1-字符转数值、bit2-除零、bit3-CAST AS CHAR、bit4-CAST AS VARCHAR。0=最大容错(兼容 MySQL),各 bit 为 1=相应策略报错 |
JSON_MODE |
2 |
JSON 语法解析兼容 MySQL |
NO_AUTO_VALUE_ON_ZERO |
1 |
AUTO_INCREMENT 列插入 0 时自动插入自增值(兼容 MySQL)??? |
AUTO_INCREMENT_INCREMENT |
1 |
AUTO_INCREMENT 步长 ??? |
AUTO_INCREMENT_OFFSET |
1 |
AUTO_INCREMENT 基准偏移 ??? |
XA_COMPATIBLE_MODE |
2 |
XA 事务兼容 MySQL 的处理策略(注意:取值 2 时不支持 DBMS_XA 系统包) |
BINARY_AS_HEX |
0 |
UNHEX 函数返回 VARCHAR(兼容 MySQL)??? |
ENABLE_BLOB_CMP_FLAG |
2 |
大字段与字符串比较时,字符串转换为大字段类型(兼容 MySQL) |
| 参数 | 说明 |
|---|---|
MY_STRICT_TABLES = 0 |
最大容错模式(最接近 MySQL 默认行为):数据超长自动截断、字符转数值失败转 0、除 0 返回 NULL |
MY_STRICT_TABLES = 7 |
全部严格报错(数据超长报错 + 字符转数值失败报错 + 除零报错) |
MY_STRICT_TABLES = 31 |
最严格模式(上述全部 + CAST AS CHAR/VARCHAR 严格匹配) |
dminit PATH=/data/dmdata PAGE_SIZE=16 CASE_SENSITIVE=N CHARSET=1 BLANK_PAD_MODE=0 DB_NAME=MYSQLDB INSTANCE_NAME=MYSQL PORT_NUM=5237 SYSDBA_PWD=XXXXXX SYSAUDITOR_PWD=XXXXXX
建库后在 dm.ini 中修改/确认:
COMPATIBLE_MODE = 4
CALC_AS_DECIMAL = 2
MY_STRICT_TABLES = 0
JSON_MODE = 2
NO_AUTO_VALUE_ON_ZERO = 1
DM 的 JDBC 驱动也支持 COMPATIBLE_MODE 参数(连接字符串级别),取值为数据库名称字符串:
| 取值 | 含义 |
|---|---|
oracle |
兼容 Oracle |
mysql |
兼容 MySQL |
示例 JDBC 连接 URL:
jdbc:dm://host:5236?COMPATIBLE_MODE=oracle
jdbc:dm://host:5237?COMPATIBLE_MODE=mysql
客户端层的 COMPATIBLE_MODE 可与会话级、系统级参数独立设置,灵活控制。
静态参数无法动态修改,需要:
dm.ini 文件,修改参数值,然后重启数据库SP_SET_PARA_VALUE(scope=2, ...) 仅修改 INI 文件,再重启-- 仅写入 dm.ini 文件(scope=2),不修改内存值
SP_SET_PARA_VALUE(2, 'COMPATIBLE_MODE', 2);
-- 重启数据库后生效
动态参数可在数据库运行期间通过系统过程修改:
| 过程/函数 | 用途 |
|---|---|
SP_SET_PARA_VALUE(scope, name, value) |
修改整型参数(scope: 0=内存, 1=内存+文件, 2=仅文件) |
SP_SET_PARA_DOUBLE_VALUE(scope, name, value) |
修改浮点型参数 |
SP_SET_PARA_STRING_VALUE(scope, name, value) |
修改字符串类型参数 |
SP_SET_INI_PARA_VALUE(scope, name, value) |
通用修改(整型/浮点/字符串),使用 VARCHAR 传入值 |
SF_SET_SYSTEM_PARA_VALUE(name, value, deferred, scope) |
修改系统级参数 |
SF_SET_SESSION_PARA_VALUE(name, value) |
仅修改当前会话的参数值 |
SF_GET_PARA_VALUE(scope, name) |
查询当前参数值 |
SP_RESET_SESSION_PARA_VALUE(name) |
重置某会话级参数为系统级默认值 |
示例:
-- 动态修改 MY_STRICT_TABLES,同时写入内存和文件
SP_SET_PARA_VALUE(1, 'MY_STRICT_TABLES', 7);
-- 仅当前会话修改 CALC_AS_DECIMAL
SF_SET_SESSION_PARA_VALUE('CALC_AS_DECIMAL', 2);
-- 查询 COMPATIBLE_MODE 当前值
SELECT SF_GET_PARA_VALUE(2, 'COMPATIBLE_MODE');
DM 管理工具 → 控制台工具 → 查看实例配置属性,在"兼容性"分类下可查看和修改兼容性相关参数。
COMPATIBLE_MODE = 2FLOAT_MODE = 1(必须)CASE_SENSITIVE = Y(建库参数)BLANK_PAD_MODE = 1(建库参数)NUMBER_MODE = 1ORA_DATE_FMT = 1DATETIME_FMT_MODE = 1LEGACY_SEQUENCE = 0PL_SQLCODE_COMPATIBLE = 1COMPATIBLE_MODE = 4CASE_SENSITIVE = N(建库参数)CALC_AS_DECIMAL = 2MY_STRICT_TABLES = 0(最大容错,兼容 MySQL 默认行为)JSON_MODE = 2NO_AUTO_VALUE_ON_ZERO = 1COMPATIBLE_MODE 的修改会影响数据存储格式和操作结果,一旦选定后修改可能导致已有数据异常,务必在建库前确定。COMPATIBLE_MODE=2 时 ORA_DATE_FMT 才生效),需要整体考虑。参考文档:《DM8系统管理员手册》第2章(dm.ini配置参数)、第6章(创建和配置DM数据库)、第20章(问题跟踪和解决 - 调整配置参数)
https://eco.dameng.com
文章
阅读量
获赞
