【DM】达梦数据库与MySQL适配
作者:mmseoamin日期:2023-12-20

一、达梦入门技术文档

新手直接看达梦入门技术文档即可

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第1张

二、达梦数据库

1、介绍

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM,它具有如下特点:通用性、高性能、高可用、跨平台、高可扩展

2、与MySQL的区别

(1)创建表的时候,不支持在列的后面直接加comment注释,使用 COMMENT ON IS 代替,如:

   COMMENT ON TABLE xxx IS xxx
   COMMENT ON COLUMN xxx IS xxx

(2)不支持 date_sub 函数,使用 dateadd(datepart,n,date) 代替,其中,datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n), second(ss,s), millisecond(ms),例子:

select dateadd(month, -6, now());
select dateadd(month, 2, now());

(3)不支持 date_format 函数,它有三种代替方法:

A: 使用 datepart 代替:语法:datepart(datepart, date),返回代表日期的指定部分的整数,datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n),second(ss,s), millisecond(ms),例子:

select datepart(year, '2023-04-13 08:45:00'); --2023
select datepart(month, '2022-12-13 08:45:00'); --12

B: 使用 date_part 代替,功能和 datepart 一样,写法不同,参数顺序颠倒,且都要加引号,例子:

select date_part('2023-12-13 08:45:00', 'year');--2023
select date_part('2022-12-13 08:45:00', 'mm'); -- 12

C: 使用 extract 代替,语法:extract(dtfield from date),从日期类型date中抽取dtfield对应的值,dtfield 可以是 year,month,day,hour,minute,second,例子:

select extract(year from  '2023-12-13 08:45:00'); --2023
select extract(month from  '2022-12-13 08:45:00'); --12

(4)不支持 substring_index 函数, 使用 substr / substring 代替,语法:

substr(char[,m[,n]])
substring(char[from m[ for n]])

(5)不支持 group_concat 函数,使用 wm_concat 代替,例子:

select wm_concat(id) as idstr from persion ORDER BY id ;

(6)不支持 from_unixtime 函数,使用 round 代替,语法:

round(date[,format])

(7)不支持 case-when-then-else ,例如:

select case  when id = 2 then "aaa" when id = 3 then "bbb" else "ccc" end as test from (select id from person) tt;

(8)current_timestamp 的返回值带有时区,例子:

select current_timestamp();
2023-04-37 14:34:18.433839 +08:00

3、数据迁移

三、JAVA项目连接DM数据库

1、引入依赖


	com.dameng
    Dm8JdbcDriver18
    8.1.1.49

2、Nacos中配置

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第2张

四、MySQL转达梦sql注意事项

1、``不可以用

`type` 需要去掉``

2、达梦数据库错误代码-4080:不是 GROUP BY 表达式

1、GROUP BY 和 ORDER BY 一起使用时,ORDER BY 要在 GROUP BY 的后面。
2、在 select 需要查询的语句中选中的字段,必须出现在 GROUP BY 子句中
使用 GROUP BY 要注意以下问题:
1.在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列。分组列的数据类型不能是多媒体数据类型;
2.分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;
3.当分组列值包含空值时,则空值作为一个独立组;
4.当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;
5. GROUP BY 子句中至多可包含 255 个分组列; 6. ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。

3、达梦数据库报错「-2106」:无效的表或视图名

1、确认程序连接达梦的用户名,确认该用户是否有select这张表的权限;

2、检查这张表的所属模式,如果模式名与用户名相同,可以用select * from 表名;如果模式名与用户名不同,需要使用 select * from 模式名.表名; 的语法。

3、nacos中url使用schema指定模式:

注意:模式不可以使用-连字符,最好使用下划线

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第3张

4、DATE_SUB函数

expr 在达梦中需要加单引号,建议使用到这类函数时数字加上单引号。

count(YEAR(create_time) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR)) OR NULL) as lastYearNum
改为:
count(YEAR(create_time) = YEAR(DATE_SUB(NOW(),INTERVAL '1' YEAR)) OR NULL) as lastYearNum

5、SUM 的参数必须为数值类型,这里做了逻辑运算就不是数值了。

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第4张

6、yearweek 函数

达梦数据库没有 yearweek ,使用 year 函数 week 函数 结合

select yearweek('2022-01-01'); //mysql写法
select concat(year('2022-01-01'), week('2022-01-01'));//达梦写法

7、count中进行比较,导致错误

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第5张

如何修改:使用sum即可

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第6张

8、迁移报错

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第7张

解决方案:迁移外键的时候,取消“保留引用表原有的模式信息”功能,选择迁移对象->点击转换

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第8张

9、MySQL 的ON DUPLICATE KEY UPDATE语句在达梦数据库中使用的方式

10、无法解析的成员访问表达式[UUID]

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第9张

解决方案:

1、在imp业务层设置了uuid

2、在 DM 数据库中可以使用以下两种方法生成 UUID:

使用 SYS_GUID() 函数生成 UUID,该函数返回一个唯一标识符,可以作为列的默认值或者手动插入。

代码示例:

CREATE TABLE your_table (
  id VARCHAR2(40) DEFAULT SYS_GUID() PRIMARY KEY,
  ...
);

使用 rawtohex(sys_guid()) 函数将 UUID 转换为字符串,然后插入表中。

代码示例:

INSERT INTO your_table (id, ...) VALUES (rawtohex(sys_guid()), ...);

注意,使用第二种方法时,需要将 UUID 转换为字符串,因为 DM 数据库中没有原生的 UUID 类型。

11、Activiti7.X支持达梦数据库

注意事项持续更新中…

【DM】达梦数据库与MySQL适配,在这里插入图片描述,第10张