【DM版本】:DM8
【操作系统】:Linux
【CPU】: X86
【问题描述】*:
是否有文档列举开启兼容MYSQL模式( compatible_mode=4)后,兼容支持了哪些能力,比如建库建表,SQL语法,数据类型等等,是完全支持,还是部分支持,可以列举支持内容,或者列举不兼容的内容。感谢回答~(也可以仅列举兼容的SQL语言语法内容)
1 字符串反转策略
兼容MYSQL后,按字节反转字符串;若不兼容,则按字符反转字符串。
示例:
COMPATIBLE_MODE=4,MYSQL按字节反转字符串。
SQL> SELECT REVERSE('中国');
行号 "REVERSE"('中国')
1 ��學�
COMPATIBLE_MODE=0,DM按字符反转字符串。
SQL> SELECT REVERSE('中国');
行号 "REVERSE"('中国')
1 国中
2 字符串转换为DATE类型
兼容MYSQL后,字符串转换为DATE类型时,假设字符串为“YEAR-MONTH-DAY”,如果YEAR所处区间为[0,70),则设置转换后的年份为2000+YEAR;如果YEAR所处区间为[70,99],则设置转换后的年份为1900+YEAR。若不兼容,则不修改YEAR。
示例:
COMPATIBLE_MODE=4,以70为界限修改年份。
SQL> SELECT TO_DATE('69-06-12','YYYY-MM-DD');
行号 TO_DATE('69-06-12','YYYY-MM-DD')
1 2069-06-12 00:00:00
SQL> SELECT TO_DATE('70-06-12','YYYY-MM-DD');
行号 TO_DATE('70-06-12','YYYY-MM-DD')
1 1970-06-12 00:00:00
COMPATIBLE_MODE=0,不对年份进行修改。
SQL> SELECT TO_DATE('69-06-12','YYYY-MM-DD');
行号 TO_DATE('69-06-12','YYYY-MM-DD')
1 69-06-12 00:00:00
SQL> SELECT TO_DATE('70-06-12','YYYY-MM-DD');
行号 TO_DATE('70-06-12','YYYY-MM-DD')
1 70-06-12 00:00:00
3 插入字符串超长
兼容MYSQL后,如果插入字符串超长,则将字符串截断至定义长度后插入;若不兼容,则报错。
本兼容处理仅支持常规数据的插入、删除以及更新等DML操作中的字符串超长截断,类型转换操作中的字符串超长情况仍会报错,且如果批量插入压缩数据,也会报错。
示例:
准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C VARCHAR(3));
SQL> COMMIT;
COMPATIBLE_MODE=4,将超长字符串截断至定义长度后插入。
SQL> INSERT INTO TEST VALUES('ABCDE');
影响行数 1
SQL> SELECT * FROM TEST;
行号 C
1 ABC
COMPATIBLE_MODE=0,插入字符串超长报错。
SQL> INSERT INTO TEST VALUES('ABCDE');
[-6169]:列[C]长度超出定义.
4 SELECT…INTO…语句插入空行
兼容MYSQL后,PL/SQL中利用SELECT … INTO … 语句插入空行时,不产生异常;若不兼容,则产生异常。
示例:
准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(ID INT,C VARCHAR(5));
SQL> INSERT INTO TEST VALUES(1,'AAA');
SQL> INSERT INTO TEST VALUES(2,'BBB');
SQL> INSERT INTO TEST VALUES(3,'CCC');
SQL> COMMIT;
COMPATIBLE_MODE=4,SELECT … INTO … 插入空行不产生异常。
SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
2 TYPE T_R_D IS RECORD(R_ID TEST.ID%TYPE,R_C TEST.C%TYPE);
3 T_REC T_R_D;
4 BEGIN
5 SELECT ID,C INTO T_REC FROM TEST WHERE ID=2;
6 SELECT ID,C INTO T_REC FROM TEST WHERE ID=4;
7 DBMS_OUTPUT.PUT_LINE('ID:'||T_REC.R_ID||' C:'||T_REC.R_C);
8 END;
9 /
ID:2 C:BBB
DMSQL 过程已成功完成
COMPATIBLE_MODE=0,SELECT … INTO … 插入空行产生异常。
SQL> DECLARE
2 TYPE T_R_D IS RECORD(R_ID TEST.ID%TYPE,R_C TEST.C%TYPE);
3 T_REC T_R_D;
4 BEGIN
5 SELECT ID,C INTO T_REC FROM TEST WHERE ID=2;
6 SELECT ID,C INTO T_REC FROM TEST WHERE ID=4;
7 DBMS_OUTPUT.PUT_LINE('ID:'||T_REC.R_ID||' C:'||T_REC.R_C);
8 END;
9 /
DECLARE
TYPE T_R_D IS RECORD(R_ID TEST.ID%TYPE,R_C TEST.C%TYPE);
T_REC T_R_D;
BEGIN
SELECT ID,C INTO T_REC FROM TEST WHERE ID=2;
SELECT ID,C INTO T_REC FROM TEST WHERE ID=4;
DBMS_OUTPUT.PUT_LINE('ID:'||T_REC.R_ID||' C:'||T_REC.R_C);
END;
[-7065]:数据未找到.
5 GROUP BY语法
兼容MYSQL后,如果查询语句中包含GROUP BY子句,则查询项中支持非GROUP BY表达式,对于查询项中的非GROUP BY表达式,其返回结果为各组中的第一行记录的值;若不兼容,如果查询语句中包含GROUP BY子句,则查询项中不支持非GROUP BY表达式。
示例:
准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST(C1 VARCHAR(3),C2 INT,C3 INT);
SQL> INSERT INTO TEST VALUES('A',1,1);
SQL> INSERT INTO TEST VALUES('A',2,2);
SQL> INSERT INTO TEST VALUES('B',3,3);
SQL> INSERT INTO TEST VALUES('C',4,4);
SQL> COMMIT;
COMPATIBLE_MODE=4,查询项中包含非GROUP BY表达式C3,语句可以成功执行,C3的返回值为各组中的第一行记录的C3的值。
SQL> SELECT C1,MAX(C2),C3 FROM TEST GROUP BY C1;
行号 C1 MAX(C2) C3
1 A 2 1
2 B 3 3
3 C 4 4
COMPATIBLE_MODE=0,查询项中包含非GROUP BY表达式C3,报错。
SQL> SELECT C1,MAX(C2),C3 FROM TEST GROUP BY C1;
第1 行附近出现错误[-4080]:不是 GROUP BY 表达式.
6 修改自增列
兼容MYSQL后,支持修改自增列;若不兼容,则不支持修改自增列
示例:
准备如下测试表。
SQL> DROP TABLE TEST;
SQL> CREATE TABLE TEST (C1 INT IDENTITY(1,1) ,C2 VARCHAR,C3 VARCHAR);
SQL> SET IDENTITY_INSERT TEST ON;
SQL> INSERT INTO TEST(C1,C2,C3) VALUES(1,'A','B');
SQL> CREATE OR REPLACE TRIGGER TRG1
2 BEFORE UPDATE OF C1 ON TEST FOR EACH ROW
3 BEGIN
4 :NEW.C2='XX';
5 END;
6 /
SQL> COMMIT;
COMPATIBLE_MODE=4,支持修改自增列。
SQL> SET SERVEROUT ON;
SQL> DECLARE
2 A VARCHAR(5);
3 BEGIN
4 UPDATE TEST SET C1=11 WHERE C1<4 RETURN C2 INTO A;
5 PRINT A;
6 END;
7 /
XX
DMSQL 过程已成功完成
COMPATIBLE_MODE=0,不支持修改自增列。
SQL> SET SERVEROUT ON;
SQL> DECLARE
2 A VARCHAR(5);
3 BEGIN
4 UPDATE TEST SET C1=11 WHERE C1<4 RETURN C2 INTO A;
5 PRINT A;
6 END;
7 /
第4 行附近出现错误[-2664]:试图修改自增列[C1].
目前兼容mysql就是以上这些