一、创建数据库实例得时候需要修改 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修改
mysql | DM兼容mysql模式 | 备注 | 修改方案 |
ifnull() | √ | ||
end | × | DM关键词,需修改程序 | |
DATE_FORMAT | √ | ||
concat_ws | × | ||
group_concat | × | wm_concat只支持distinct字段去重,如果还需要排序,建议使用listagg | wm_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 when | select 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; |