转载自:达梦数据库适配(mysql适配达梦数据库)注意内容
达梦数据库一般是国产化适配选择的一种数据库,最近做这方面是的适配,感觉是基于oracle所开发的一种数据库,对 mysql 兼容性并不强,现在列一下需要注意的内容。
1.ORDER BY项不在DISTINCT查询项中
这种问题比较常见,DISTINCT 的查询项需要在 ORDER BY 项,这种得根据业务实际修改。
2.GRUOP BY 字段需要跟select字段对应上
跟 ORDER BY 类似,GRUOP BY 中的字段要出现在 select 字段中。
3.str_to_date()函数不适用
改为 to_date() 函数,参数也需要修改。
4.group_concat()函数不适用
改为 wm_concat() 或者 LISTAGG(name,’,’) GROUP_CONCAT 后面的 order by 也不适用
5.convert(value,type)函数
达梦中的 convert 和mysql 的使用方式是相反的。
换为 convert(type,value)
6.if()函数
改为 case when
7.FIND_IN_SET()函数
自建函数
CREATE
OR REPLACE FUNCTION FIND_IN_SET
(
piv_str1 varchar2,
piv_str2 varchar2,
p_sep varchar2 := ','
)
RETURN NUMBER
IS
l_idx number:=0; -- 用于计算piv_str2中分隔符的位置
str varchar2(500); -- 根据分隔符截取的子字符串
piv_str varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str
res number :=0; -- 返回结果
loopIndex number :=0;
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr( piv_str, p_sep, 1 ) = 0 THEN
IF piv_str = piv_str1 THEN
res := 1;
END IF;
ELSE
-- 循环按分隔符截取piv_str
LOOP
l_idx := instr( piv_str, p_sep );
loopIndex := loopIndex + 1;
-- 当piv_str中还有分隔符时
IF l_idx > 0 THEN
-- 截取第一个分隔符前的字段str
str := substr( piv_str, 1, l_idx - 1 );
-- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断
IF str = piv_str1 THEN
res := loopIndex;
EXIT;
END IF;
piv_str := substr(piv_str, l_idx + length( p_sep ));
ELSE
-- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1
IF piv_str = piv_str1 THEN
res := loopIndex;
END IF;
-- 无论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回res
RETURN res;
END FIND_IN_SET;
COMMIT;
8.试图在blob或者clob列上排序或比较
需要将大数据类型的字段转换为字符类型
使用 to_char() 函数转换后可适配成功
9.双引号的常量 需要改为 单引号的常量
比如 select “aaa” from [table]
改成 select ‘aaa’ from [table]
10.表字段有关键字的,引用需要加上双引号
比如 select function from [table]
或者 select function
from [table]
改为 select “function” from [table]
11.force index 强制索引
需要修改语法,如果真需要走强制索引,需要使用
SELECT /*+INDEX(T1, IDX_T1_ID) */ * FROM T1 WHERE ID > 2011 AND NAME < ‘XXX’;
12.INTERVAL 后面的参数 需要加单引号
13.CAST(xxx as signed INTEGER) 不支持
14.除0错误 先判断字段是否为0
15.CONCAT(“%”,xxx,“%”) 改为单引号
16.TO_DATE(NOW(),‘yyyy-MM-dd’) 报错
改为 DATE_FORMAT(SYSDATE, ‘%Y-%m-%d’)
评论区