mysql转DM达梦数据库+springboot兼容DM数据库+springboot兼容activity5.22.0

news2024/11/17 11:43:56
由于现在做的项目中需要针对数据库进行国产化操作,最终完成从mysql到达梦的迁移,记录整合迁移记录如下:

安装初始化达梦数据库(傻瓜式安装即可)

安装达梦数据库(windows、linux)

初始化数据库实例关键信息

  • 工具:DM数据库配置助手

  • 步骤如下:

  • 初始化数据库实例后,切换到DM管理工具进行连接

  • 执行数据库兼容性sql

>> 查看COMPATIBLE_MODE参数:

select para_name,para_value,para_type from v$dm_ini where para_name=‘COMPATIBLE_MODE’;

>> 经过查询参数意义如下:

0:不兼容,1:兼容SQL92标准,2:兼容ORACLE,3:兼容MS SQL SERVER,4:兼容MYSQL

>> 我们兼容mysql,所以执行

sp_set_para_value(2,‘COMPATIBLE_MODE’,4);

>> 执行完成记得提交事务!!这个是区别于mysql得必备步骤。

  • 字符串比较大小写敏感取消原因说明

>> 如果不取消,那么每个查询都得加上数据库名(模式名).表名进行查询,并且表名还得加上双引号,where筛选条件后得列名和值也都得加上双引号,语法很是严格

>> 取消了大小写敏感后,那么我们springboot中得某些jar包内得sql语法兼容性就更强了,至少可以保证顺利启动

>> 写法更类似mysql,如: 可以直接写成select * from sys_user进行查询操作

数据库迁移

具体数据库迁移教程CSDN一大堆,各有所长,综合来看吧。

我们这里主要是mysql迁移达梦实现

主要是以下几点急需注意:

1.mysql中json格式转达梦数据类型。

  • 这个json类型在mysql中是存在得,但是在达梦中是不存在得,直接转是不能转成功得。

  • 解决方式网上几乎找不到解决方式,而且都是挂羊头卖狗肉,其实就是将mysql中得json数据类型转成longText类型,然后再重新进行迁移,就可以完美迁移成功了,如果最好在在列进行约束下,设置列约束IS JSON,这样在进行存储得时候就可以按需存储。

2. mysql中和达梦varchar类型字符和字节数不一致,mysql中varchar(20),在达梦中差不多需要varchar(40)才能够存储。

  • 所以网上针对这块设置说的很少,最后是经过多次测试和重建数据库实例发现一切皆源于配置,前面得图片中varchar类型以字符存储勾上后就可以完美解决问题

3. goupby 和 orderby不能作用于text、blob、clob等大字段中。

  • 描述: 在DM8上对大字段类型列进行排序、分组等操作时,会报错-2685:试图在blob或者clob列上排序或比较

  • 处理方式:修改数据库参数ENABLE_BLOB_CMP_FLAG

-- 第三个参数是0或者1 0是不能操作大字段;类型 1是可以操作大数据类型
sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);
-- 查询是狗更改成功
select para_name,para_value,para_type from v$dm_ini where para_name='ENABLE_BLOB_CMP_FLAG';
  • 执行完成后提交事务。

  • 其他处理方式 https://blog.csdn.net/Mrkill123/article/details/127478828

4. 其他问题都可以在网上找答案对症下药,我只记录网上很少或者很难找到得解决方式。

springboot兼容达梦数据库

达梦数据源配置(JDBC)

补充说明: DM8在集成到springboot后需要针对语言包进行配置引进

<!--达梦数据库驱动包 -->
   <dependency>
      <groupId>com.dameng</groupId>
      <artifactId>DmJdbcDriver18</artifactId>
      <scope>system</scope>
      <version>8.1.1.193</version>
      <systemPath>${project.basedir}/../lib/DmJdbcDriver18.jar</systemPath>
  </dependency>
<!--达梦数据库hibernate语言包 -->
  <dependency>
      <groupId>org.hibernate.dialect</groupId>
      <artifactId>DmDialect</artifactId>
      <version>1.8</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/../lib/DmDialect-for-hibernate5.3.jar</systemPath>
  </dependency>
# 达梦 连接地址
url:jdbc:dm://IP:5236/SYSDBAzeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&clobAsString=true
username: SYSDBA
password: SYSDBA
jpa:
 show-sql: true
 properties:
   hibernate:
     dialect: org.hibernate.dialect.DmDialect

springboot整合activity5.22.0

原则上acitivity是不兼容DM数据库得,我们得修改acitivity得源码,然后让他兼容。

参考文档:Activiti5.22.0扩展支持达梦数据库.

pdf官方文档:

链接:https://pan.baidu.com/s/1viwZ9ikYUdtB7YERtFic1Q

提取码:zzyc

语法总结

以下介绍来自于达梦数据库官网,相关的文档在官网中也是可以下载的。

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

1、通用性

达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。

达梦数据库管理系统产品实现了平台无关性,支持Windows系列、各版本Linux(2.4及2.4以上内核)、Unix、Kylin、AIX、Solaris等各种主流操作系统。达梦数据库的服务器、接口程序和管理工具均可在32位/64 位版本操作系统上使用。

2、高性能

支持列存储、数据压缩、物化视图等面向联机事务分析场景的优化选项;

通过表级行存储、列存储选项技术,在同一产品中提供对联机事务处理和联机分析处理业务场景的支持;

3、高可用

可配置数据守护系统(主备),自动快速故障恢复,具有强大的容灾处理能力。

4、跨平台

跨平台,支持主流软硬件体系(支持windows、Linux、中标麒麟、银河麒麟等操作系统),支持主流标准接口。

5、高可扩展

支持拓展软件包和多种工具,实现海量数据分析处理、数据共享集群(DSC)和无共享数据库集群(MPP)等扩展功能

与MySQL的区别

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

COMMENT ON TABLE xxx IS xxx

COMMENT ON COLUMN xxx IS xxx

  • 不支持 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());

  • 不支持 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, '2018-12-13 08:45:00'); --2018
  select datepart(month, '2018-12-13 08:45:00'); --12

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

例子:select date_part('2018-12-13 08:45:00', 'year');--2018
select date_part('2018-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 ‘2018-12-13 08:45:00’); --2018

select extract(month from ‘2018-12-13 08:45:00’); --12

  • 不支持 substring_index 函数, 使用 substr / substring 代替,

语法:

substr(char[,m[,n]])

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

  • 不支持 group_concat 函数,使用 wm_concat 代替,

例子:

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

  • 不支持 from_unixtime 函数,使用 round 代替

语法:round(date[,format])

  • 不支持 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;

  • current_timestamp 的返回值带有时区,

例子:

select current_timestamp();

2018-12-17 14:34:18.433839 +08:00

  • convert(type, value) 函数,

与 mysql 的 convert 一样,但是参数是反过来的,mysql 是 convert(value, type)

  • 不支持 on duplicate key update,

使用 merge into 代替

  • 不支持 ignore,即 insert ignore into

  • 不支持 replace into,

使用 merge into 代替

  • 不支持 if。

  • 不支持 “”,只支持’’

  • 不支持 auto_increment, 使用 identity 代替

如: identity(1, 1),从 1 开始,每次增 1

  • 不支持 longtext 类型,

可用 CLOB 代替。

总结

达梦数据库和 oracle 数据库比较像,如果找不到和 MySQL 对应的函数,可以看下 oracle 的相关函数。

其他具体语法和安装运维等细节详细见达梦官网和安装包doc文档

https://eco.dameng.com/document/dm/zh-cn/sql-dev/index.html

实战小记(持续更新):

  • 达梦数据库开启MySQL兼容后,大部门语法可以兼容MySQL,比如groupby,不兼容MySQL,那么groupby后面出现的列必须在select出现,兼容mysql后,则跟MySQL中groupby一样。

  • 达梦数据库char()类型是定长的 如果从MySQL同步过来,开始是char(1)–>char(3)那么存的值"y"就会变成"y ",多了空格站位,这样我们程序读取出来进行判断等于的时候就会出错。

【解决方法】:

如下三种方法

>>修改char类型为varchar2类型。

在DTS迁移时,映射char类型为varchar2类型;

>>生成批量修改char为varchar2

select ‘alter table ‘||a.TABLE_NAME||’ modify ‘||a.COLUMN_NAME||’ VARCHAR2(’||data_length||‘);’ from all_tab_columns a where a.data_type=‘CHAR’ AND OWNER=‘用户名’;

>>通过rtrim函数把数据右边的空格清除掉

update 表名 set 列名1=rtrim(列名1);

  • 假如我们MySQL储存的数据是blob,在我们达梦中存储的是image或者BLOB类型,那么我们要读取出来如果无法显示的情况出现,可以使用函数可视化处理select utl_raw.cast_to_varchar2(dbms_lob.substr(表列)),即可完美解决(JAVA可以在xml中进行编写)

  • 将数据类型char批量转成varchar2

-- 批量处理截取char超过得空格字符
select 'update '||a.TABLE_NAME||' set '||a.COLUMN_NAME||'= rtrim('||a.COLUMN_NAME||');'
from all_tab_columns a where a.data_type='VARCHAR2' AND OWNER='SYSDBA';
-- 批量将所有表中得char类型替换成varchar2类型
select 'alter table '||a.TABLE_NAME||' modify '||a.COLUMN_NAME||' VARCHAR2('||data_length||');'
from all_tab_columns a where a.data_type='CHAR' AND OWNER='SYSDBA';
  • 达梦关键字转化:``–>“”,关键字mysql是`号引起得,达梦用”“包关键字,如:”name“

  • 达梦组合排序:如果列为null排在前面,达梦暂时使用nulls first来进行处理

  • -- mysql

  • order by name desc,name is not null;

  • -- 达梦

  • order by name desc,name NULLS LAST;

  • groupby 不是表达式(实例设置sql)

select para_name,para_value,para_type from v$dm_ini where para_name='GROUP_OPT_FLAG';
sp_set_para_value(1,'GROUP_OPT_FLAG',1);
  • mysql需要对某列按照中文首字母进行排序: mysql:convert(列 using gbk) dm: nlssort(列, ‘NLS_SORT = SCHINESE_PINYIN_M’)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码质量与安全 | 新时代:2023年商业软件开发的五大关键目标

进入2023年&#xff0c;技术趋势仍然聚焦于人工智能、边缘智能和气候变化领域&#xff0c;但供应链增速放缓和日益增长的消费者需求阻碍着创新的步伐。为了在行业中保持竞争力&#xff0c;并实现软件工程预定目标&#xff0c;软件开发领导者需要主动制定预算和时间管理计划&…

Java设计模式-模板模式Template

介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;z 在一个抽象类公开定义了执行。它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。简单说&#xff…

中移链合约常用开发介绍 (二)多索引表的使用

一、目的本文详细介绍了开发、部署和测试一个地址簿的智能合约的流程&#xff0c;适用于EOS的初学者了解如何使用智能合约实现本地区块链上数据的持久化和对持久化数据的增删改查。二、智能合约介绍区块链作为一种分布式可信计算平台&#xff0c;去中心化是其最本质的特征。每笔…

17.Isaac教程--机器学习流程

机器学习流程 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录机器学习流程模拟训练PC 和边缘设备上的推理使用 TensorRT 进行推理Torch推理使用 Tensorflow 进行推理示例PyCodelet配套代码Tensorflow 推理小码TensorRT 推理小码SampleAc…

23种设计模式(三)——模板方法模式【组件协作】

文章目录意图什么时候使用模板方法真实世界类比常说的钩子模板方法的实现模板方法模式的优缺点亦称&#xff1a; Template Method 意图 它的主要思想是&#xff0c;定义一个操作的一系列步骤&#xff0c;对于某些暂时确定不下来的步骤&#xff0c;就留给子类去实现好了&#x…

位图与矢量图的区别

相信大家在日常的工作过程中&#xff0c;经常会听到位图和矢量图&#xff0c;那么位图和矢量图的区别是什么呢&#xff1f; 1.定义 ①位图&#xff1a;称为点阵图像或栅格图像&#xff0c;是由称作像素&#xff08;图片元素&#xff09;的单个点组成的。这 些点可以进行不同的排…

测试用例设计方法有哪些?举例说明

众所周知&#xff0c;测试用例是编制的一组测试输入、执行条件及预期结果&#xff0c;专门为的是某个特殊目标&#xff0c;即测试某个程序路径&#xff0c;或是核实是否满足某个特定的需求。一般来讲&#xff0c;常用的测试用例设计方法有五种&#xff0c;分别是&#xff1a;正…

微信小程序中如何实现双向绑定

一、双向绑定 在微信小程序中如何实现双向绑定&#xff1f;在开始之前先介绍下什么是双向绑定&#xff0c;js中定义变量数据后&#xff0c;通过{{}}绑定到模板中&#xff0c;这个过程是单向绑定&#xff0c;即数据的更新只能是js中更新了数据&#xff0c;模板中跟着修改。但是如…

深度学习笔记:神经网络(3)

关于本章之前内容可以参考以下之前文章&#xff1a; 1 https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 2 https://blog.csdn.net/Raine_Yang/article/details/128584916?spm1001.2014.3001.5501 神经网络的输出层设计 机器学习问题一般…

2022年12月青少年软件编程(Python) 等级考试试卷(三级)

2022. 12 青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;三级&#xff09; 一、 单选题(共 25 题&#xff0c; 共 50 分) 1.列表 L1 中全是整数&#xff0c; 小明想将其中所有奇数都增加 1&#xff0c; 偶数不变&#xff0c; 于是编写了如下图 所示的…

高级树结构之平衡二叉树(ALV树)

文章目录平衡二叉树简介失衡类型&处理办法RR型失衡【左旋调整】调整演示代码实现LL型失衡【右旋调整】调整演示代码实现RL型失衡【先右旋后左旋调整】调整演示代码实现LR型失衡【先右旋后左旋调整】调整演示代码实现插入操作综合代码演示平衡二叉树简介 在数据有序的情况下…

Codeforces Round #842 (Div. 2)

Codeforces Round #843 (Div. 2) 传送门 不想搞的很累&#xff0c;对自己不做要求&#xff0c;有兴趣就做。 A. Greatest Convex #include <bits/stdc.h>using namespace std; const int maxn 1e6 10; vector<int> cnt[maxn]; map<int, int> mp;int mai…

nvm安装 疑难问题解决

nvm介绍 NVM是node.js的版本管理器&#xff0c;设计为每个用户安装&#xff0c;并在每个shell中调用。nvm可以在任何兼容posix的shell (sh、dash、ksh、zsh、bash)上运行&#xff0c;特别是在这些平台上:unix、macOS和windows WSL。 nvm安装 &#xff01;&#xff01;重要&a…

强化学习在智能补货场景的应用

本文作者&#xff1a;应如是&#xff0c;观远算法团队工程师&#xff0c;毕业于伦敦帝国理工学院计算机系&#xff0c;主要研究方向为强化学习、时间序列算法及其落地应用。深耕零售消费品场景&#xff0c;解决供应链运筹优化问题。为客户提供基于机器学习的AI解决方案。1. 背景…

2023.Q1 go语言记录

1. Go 语言数组声明和初始化var variable_name [SIZE] variable_type&#xff0c;eg&#xff1a;var balance [10] float32var balance [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}balance : [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}长度不确定的初始化var balance [...]float…

少儿Python每日一题(21):八皇后问题

原题解答 本次的题目如下所示: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即,…

【Ansible】Ansible Playbook 的任务控制

Ansible Playbook 的任务控制 文章目录Ansible Playbook 的任务控制一、Ansible 任务控制基本介绍二、条件判断1.解决第一个问题2.nginx 语法校验三、循环控制四、Tags 属性五、Handlers 属性一、Ansible 任务控制基本介绍 任务控制类似于编程语言中的 if …、for …等逻辑控制…

MSF社会工程学

● Metasploit发现两个远程代码执行漏洞 ○ 问题都出在WEB组件方面 ○ MSF不受影响 ● 安全面前任何软件都是平等的 ○ 没有绝对安全的软件 为什么要说社会工程学 ● Metasploit可以很好的配合到社会工程学攻击的各个阶段 ● Setoolkit工具包大量依赖Metasploit ● 基于浏览器…

[SUCTF 2019]EasySQL

目录 预先知识 信息收集 思路 源码分析 非预期解 预期解 补充 预先知识 环境 use mysql; create table if not exists my_table( id int PRIMARY key auto_increment, name VARCHAR(20), age int); insert into my_table values(NULL,xiao,19); insert into my_table v…

BUFF80双模蓝牙5.2热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09;软件支持一些常见问题解答&#xff08;FAQ&#xff09;首次使用测试步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功能层1配置的功能默认的快捷键蓝牙参数蓝牙…