您现在的位置是:首页 >技术交流 >DM COMPATIBLE_MODE=2兼容Oracle简介网站首页技术交流
DM COMPATIBLE_MODE=2兼容Oracle简介
本章节主要介绍 DM 兼容 ORACLE 时的兼容策略。
1.1 空串与 NULL
DM 区分空串与 NULL,但 ORACLE 不区分,ORACLE 中只有 NULL 的概念,因此兼容ORACLE 时,DM 在以下几种情形中对空串与 NULL 进行了兼容处理:
--查询结果为空串
--输出函数打印 NULL
--加载值为空串的字符串变量/参数
--为字符串变量/参数赋值空串
--空串与 NULL 串联
1.1.1 查询结果为空串
兼容 ORACLE 后,当查询结果为空串时显示为 NULL;若不兼容,则显示为空。
示例:
COMPATIBLE_MODE=0,准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(10));
SQL> INSERT INTO TEST VALUES('');
SQL> COMMIT;
COMPATIBLE_MODE=2,当查询结果为空串时显示为 NULL。
SQL> SELECT * FROM TEST;
---------- ----
1 NULL
COMPATIBLE_MODE=0,当查询结果为空串时显示为空。
SQL> SELECT * FROM TEST;
---------- ----
1
1.1.2 输出函数打印 NULL
兼容 ORACLE 后,输出函数打印的值为 NULL 时打印为空;若不兼容,则打印为 NULL。
示例:
COMPATIBLE_MODE=2,输出函数打印的值为 NULL 时打印为空。
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
2 A INT;
3 BEGIN
4 A:=NULL;
5 PRINT A;
6 END;
7 /
DMSQL 过程已成功完成
COMPATIBLE_MODE=0,输出函数打印的值为 NULL 时打印为 NULL。
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
2 A INT;
3 BEGIN
4 A:=NULL;
5 PRINT A;
6 END;
7 /
NULL
1.1.3 加载值为空串的字符串变量/参数
兼容 ORACLE 后,加载字符串变量/参数时,若字符串为空串则强制转换为 NULL;若不兼容,则不进行转换。
示例:
COMPATIBLE_MODE=0,准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(10));
SQL> INSERT INTO TEST VALUES('');
SQL> COMMIT;
COMPATIBLE_MODE=2,执行 DECODE 函数加载参数 C 时,将空串强制转换为 NULL进行相应计算。
SQL> SELECT DECODE(C,NULL,10,20) FROM TEST;
行号 DECODE(C,NULL,10,20)
---------- --------------------
1 10
COMPATIBLE_MODE=0,执行 DECODE 函数加载参数 C 时,不将空串转换为 NULL。
SQL> SELECT DECODE(C,NULL,10,20) FROM TEST;
行号 DECODE(C,NULL,10,20)
---------- --------------------
1 20
1.1.4 为字符串变量/参数赋值空串
兼容 ORACLE 后,为字符串变量/参数赋值空串时,将空串强制转换为 NULL;若不兼容,则不进行转换。
示例:
COMPATIBLE_MODE=2,创建测试表,并在测试表中插入空串。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(5));
SQL> INSERT INTO TEST VALUES('');
SQL> COMMIT;
由于 ORACLE 不区分空串和 NULL,因此无论是直接插入空串,还是将空串转换为 NULL
之后进行插入,查询结果都将为 NULL(具体请参见 1.1.1 查询结果为空串),无法判断
究竟插入的是空串还是 NULL,而 DM 区分空串和 NULL,因此将 COMPATIBLE_MODE 重新
设置为 0,重新启动 DM 数据库,查询测试表中数据,可以看到测试表中插入的数据为 NULL而非空串。
SQL> SELECT * FROM TEST;
---------- ----
1 NULL
COMPATIBLE_MODE=0,创建测试表,并在测试表中插入空串,查询测试表中数据,
可以看到测试表中插入的数据为空串。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(5));
SQL> INSERT INTO TEST VALUES('');
SQL> SELECT * FROM TEST;
---------- ----
1
1.1.5 空串与 NULL 串联
兼容 ORACLE 后,空串与 NULL 串联,返回 NULL;若不兼容,则返回空串。
示例:
COMPATIBLE_MODE=2,空串与 NULL 串联,返回 NULL。
SQL> SELECT NULL||'';
行号 NULL||''
---------- --------
1 NULL
COMPATIBLE_MODE=0,空串与 NULL 串联,返回空串。
SQL> SELECT NULL||'';
行号 NULL||''
---------- --------
1
1.2 字符串反转策略
兼容 ORACLE 后,按字节反转字符串;若不兼容,则按字符反转字符串。
示例:
COMPATIBLE_MODE=2,ORACLE 按字节反转字符串。使用的字符集编码不同,查询结
果可能不同,当字符集编码为 GB18030 时,查询结果如下:
SQL> SELECT REVERSE('达梦');
行号 "REVERSE"('达梦')
---------- -----------------
1 蚊锎
COMPATIBLE_MODE=0,DM 按字符反转字符串。
SQL> SELECT REVERSE('达梦');
行号 "REVERSE"('达梦')
---------- -----------------
1 梦达
1.3 定义 DATE 类型
兼容 ORACLE 后,定义 DATE 类型时,将 DATE 类型强制转换为 DATETIME 类型;若
不兼容,则不进行转换。
示例:
COMPATIBLE_MODE=2,定义 DATE 类型时,将 DATE 类型强制转换为 DATETIME 类型。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C DATE);
SQL> INSERT INTO TEST VALUES(SYSDATE);
SQL> SELECT * FROM TEST;
---------- -------------------
1 2021-03-02 09:28:02
COMPATIBLE_MODE=0,定义 DATE 类型时不会转换为 DATETIME 类型。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C DATE);
SQL> INSERT INTO TEST VALUES(SYSDATE);
SQL> SELECT * FROM TEST;
---------- ----------
1 2021-03-02
1.4 插入字符串结尾空格超长
兼容 ORACLE 后,插入字符串结尾空格超长时,报错;若不兼容,则对超长字符串结
尾空格进行截断,使插入字符串长度为定义长度。
示例:
准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(3));
SQL> COMMIT;
COMPATIBLE_MODE=2,插入字符串结尾空格超长,报错。
SQL> INSERT INTO TEST VALUES('ABC ');
[-6169]:列[C]长度超出定义.
COMPATIBLE_MODE=0,插入字符串结尾空格超长,截断结尾空格,使插入的字符串
长度为定义长度 3。
SQL> INSERT INTO TEST VALUES('ABC ');
SQL> SELECT * FROM TEST;
---------- ---
1 ABC
1.5 DEC 类型转为字符串
兼容 ORACLE 后,DEC 类型数据转换为字符串时,转换结果小数点右侧结尾不补 0;若不兼容,则结尾补 0。
示例:
COMPATIBLE_MODE=2,DEC 类型数据 CAST(1.30000 AS DEC(13,5))转换为字符串时,转换结果小数点右侧结尾不补 0。
SQL> SELECT CAST(1.30000 AS DEC(13,5))||'-'||1.322323 FROM DUAL;
行号 CAST(1.3ASDEC(13,5))||'-'||1.322323
---------- --------------------------------------
1 1.3-1.322323
COMPATIBLE_MODE=0,DEC 类型数据 CAST(1.30000 AS DEC(13,5))转换为字
符串时,转换结果小数点右侧结尾补 0。
SQL> SELECT CAST(1.3 AS DEC(13,5))||'-'||1.322323;
行号 CAST(1.3ASDEC(13,5))||'-'||1.322323
---------- --------------------------------------
1 1.30000-1.322323
达梦社区地址:https://eco.dameng.com