您现在的位置是:首页 >技术交流 >DM COMPATIBLE_MODE=2兼容Oracle简介网站首页技术交流

DM COMPATIBLE_MODE=2兼容Oracle简介

吴用丶 2024-06-17 10:14:22
简介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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。