达梦数据库COMPATIBLE_MODE参数详解
本文于 15 天前发布,最后更新于 15 天前

一、参数简介

COMPATIBLE_MODE 参数用于控制 DM 在部分功能处理时与其他数据库管理系统的兼容模式。可取值

  • 0:不兼容
  • 1:兼容 SQL92 标准
  • 2:兼容 ORACLE
  • 3:兼容 MS SQL SERVER
  • 4:兼容 MYSQL
  • 5:兼容 DM6
  • 6:兼容 TERADATA。
  • 7:兼容 PG
  • 默认为 0。

用户可在 DM.INI 文件中对该参数进行配置。
本文档主要对兼容 ORACLE 数据库时的兼容策略进行详细介绍。

二、兼容 Oracle

COMPATIBLE_MODE=2,兼容 Oracle。
本章节主要介绍 DM 兼容 ORACLE 时的兼容策略。

2.1 空串与 NULL

DM 区分空串与 NULL,但 Oracle 不区分,Oracle 中只有 NULL 的概念,因此兼容 Oracle 时,DM 在以下几种情形中对空串与 NULL 进行了兼容处理:

  • 查询结果为空串
  • 输出函数打印 NULL
  • 加载值为空串的字符串变量 / 参数
  • 为字符串变量 / 参数赋值空串
  • 空串与 NULL 串联

2.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;
行号 C
---------- ----
1 NULL

COMPATIBLE_MODE=0,当查询结果为空串时显示为空。

SQL> SELECT * FROM TEST;
行号 C
---------- -
1

2.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 DBMS_OUTPUT.PUT_LINE(A);
6 END;
7 /
DMSQL 过程已成功完成
已用时间: 0.279(毫秒). 执行号:402.

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
DMSQL 过程已成功完成
已用时间: 0.351(毫秒). 执行号:411.

2.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

说明:
函数 DECODE
语法:DECODE (exp, search1, result1, … searchn, resultn [,default])
功能:查表译码,DECODE 函数将 exp 与 search1,search2, … searchn 相比较,如果等于 searchx,则返回 resultx,如果没有找到匹配项,则返回 default, 如果未定义 default,返回 NULL。

例:
SELECT DECODE(1, 1, 'A', 2, 'B');
查询结果:'A'
SELECT DECODE(3, 1, 'A', 2, 'B');
查询结果为:NULL
SELECT DECODE(3, 1, 'A', 2, 'B', 'C');
查询结果为:'C'

2.1.4 为字符串变量 / 参数赋值空串

兼容 ORACLE 后,为字符串变量 / 参数赋值空串时,将空串强制转换为 NULL;若不兼容,则不进行转换。

示例:

COMPATIBLE_MODE=2,创建测试表,并在测试表中插入空串。

SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(5));
SQL> INSERT INTO TEST VALUES('');
影响行数 1
已用时间: 0.424(毫秒). 执行号:402.
SQL> COMMIT;

将 COMPATIBLE_MODE 设置为 0,重新启动 DM 数据库,查询测试表中数据,可以看出测试表中的数据为 NULL 而非空串。

SQL> SELECT * FROM TEST;
行号 C
---------- ----
1 NULL

2.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

2.2 字符串反转策略

兼容 ORACLE 后,按字节反转字符串;若不兼容,则按字符反转字符串。

示例:

COMPATIBLE_MODE=2,ORACLE 按字节反转字符串。

SQL> SELECT REVERSE('中国');
行号 "REVERSE"('中国')
---------- -----------------
1 ��學�

COMPATIBLE_MODE=0,DM 按字符反转字符串。

SQL> SELECT REVERSE('中国');
行号 "REVERSE"('中国')
---------- -----------------
1 国中

2.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;
行号 C
---------- -------------------
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;
行号 C
---------- ----------
1 2021-03-02

2.4 插入字符串结尾空格超长

兼容 ORACLE 后,插入字符串结尾空格超长时,报错;若不兼容,则对超长字符串结尾空格进行截断,使插入字符串长度为定义长度。

示例:

准备如下测试表。

SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(3));
SQL> COMMIT;

COMPATIBLE_MODE=2,插入字符串结尾空格超长,报错。

SQL> INSERT INTO TEST VALUES('ABC ');
INSERT INTO TEST VALUES('ABC ');
[-6169]:列[C]长度超出定义.

COMPATIBLE_MODE=0,插入字符串结尾空格超长,截断结尾空格,使插入的字符串长度为定义长度 3。

SQL> INSERT INTO TEST VALUES('ABC ');
SQL> SELECT * FROM T3;
行号 C
---------- ---
1 ABC

2.5 DEC 类型转为字符串

兼容 ORACLE 后,DEC 类型数据转换为字符串时,转换结果小数点右侧结尾不补 0;若不兼容,则结尾补 0。

示例:

COMPATIBLE_MODE=2,DEC 类型数据 CAST (2.30000 AS DEC (13,5)) 转换为字符串时,转换结果小数点右侧结尾不补 0。

SQL> SELECT CAST(2.30000 AS DEC(13,5))||'-'||2.322323 FROM DUAL;
行号 CAST(2.3 AS DEC(13,5))||'-'||2.322323
---------- --------------------------------------
1 2.3-2.322323

COMPATIBLE_MODE=0,DEC 类型数据 CAST (2.30000 AS DEC (13,5)) 转换为字符串时,转换结果小数点右侧结尾补 0。

SQL> SELECT CAST(2.3 AS DEC(135))||'-'||2.322323;
行号 CAST(2.3 AS DEC(13,5))||'-'||2.322323
---------- --------------------------------------
1 2.30000-2.322323
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇