关于mysql 转DM数据库

一、创建数据库实例得时候需要修改 LENGTH_IN_CHAR

LENGTH_IN_CHAR 此参数代表字符串长度是否是字符为单位,Y:是  N:否

因为mysql 中 varcher 类型的长度单位是字符而 达蒙的 varcher2 的单位是 字节,所以会导致长度和实际长度不同,同时如果长度太长会直接截取并且最后一个字符为乱码字符。

二、修改dm.ini文件

1:ENABLE_BLOB_CMP_FLAG

 本参数是大字段是否支持排序,0:不支持 1:支持

报错形式是:达梦数据库报错-2685:试图在blob或者clob列上排序或比较

2:COMPATIBLE_MODE

本参数是兼容mysql数据库,默认是0 参数为

0:none, 1:SQL92, 2:Oracle, 3:MS SQL Server, 4:MySQL, 5:DM6, 6:Teradata

三、sql修改

mysqlDM兼容mysql模式备注修改方案
ifnull()
end×DM关键词,需修改程序
DATE_FORMAT
concat_ws×
group_concat×wm_concat只支持distinct字段去重,如果还需要排序,建议使用listaggwm_concat,如果有字符串拼接直接用||连接
group_concat(DISTINCT c.channelname order by c.type) channels -》
listagg(DISTINCT c.channelname,',' ) within  group(order by c.type) channels
concat
case when then else
d.`name`×不支持列名单引号去掉列名单引号 d.name
week×DM关键词,需修改程序
uuid()×主键规则
replace
大字段大文本字段需要转化为字符cast(msg.tpl as varchar) tpl
DM数据库字符校验比较严重,如果字段是字符
就需要给-1加上单引号
data.schoolid =-1——》data.schoolid ='-1'
设备表的分控器名称extendName——》extendname
DATE_ADD×日期加N天,减N天add_days
identity×DM关键词,需修改程序
REGEXP×DM数据库不支持本函数cd.nextsteproleids REGEXP :role_ids  --》
REGEXP_LIKE(cd.nextsteproleids , :role_ids)
||×DM数据库不支持|| -》 or
DATEDIFF×DM数据库不支持SELECT DATEDIFF( '1970-01-03', '1970-01-01' ) - 》
DATEDIFF(DY,DATE '1970-01-01', '1970-01-03' )
@rownum×DM数据库不支持,rownum执行是在order by后
边执行的,如果需要排序则需要拆开查询
select *,( @rownum := @rownum + 1 ) from zz_ssgl_student_dormitory_status,( SELECT @rownum := 0 ) r  ->
select rownum from zz_ssgl_student_dormitory_status
if达梦数据库中的if不支持返回null,如果想返回null则需要用case whenselect if (1=1 , 1, null) -》select case when 1=1 then 1 else null end
INTERVAL达梦数据库用这个关键字计算时间时,减的天数需要加单引号SELECT date_sub( '2023-01-04', INTERVAL 1 DAY ) AS date -》
SELECT date_sub( '2023-01-04', INTERVAL '1' DAY ) AS date
ifnull()达梦使用ifnull时可能会出现字符串转换出错问题
需要先判断这个值是否是数字


 
case when ISNUMERIC(t4.leavedays) = 1 then t4.leavedays else 0 end
FIND_IN_SET()22.12月后的版本支持22.12月前的达梦版本,可以自己创建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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值