mysql 信创改成达梦 需要改造的地方是哪些
MySQL → 达梦数据库(DM8)改造清单(适配信创 ARM / 鲲鹏、x86,Java 项目通用)
达梦语法高度兼容 MySQL,但不是 100% 兼容,分 5 大块:SQL 语法、函数、分页、数据类型、连接驱动、配置、特殊功能。
环境背景:你现有两套环境 CentOS7 x86、麒麟 V10 aarch64,达梦同时支持两种架构。
一、驱动 & 连接串(最先改,Java 项目)
1. Maven 依赖替换
MySQL
xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.xx</version>
</dependency>
达梦 DM8
xml
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.xxx</version>
</dependency>
注意:私服要有达梦驱动 jar,达梦官方不开源,中央仓库不存在。
2. JDBC URL、驱动类
MySQL:
plaintext
jdbc:mysql://ip:3306/dbname?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
达梦:
plaintext
jdbc:dm://ip:5236/DATABASE?zeroDateTimeBehavior=convertToNull
driver-class-name: dm.jdbc.driver.DmDriver
端口默认 5236,不是 3306!
3. 数据库概念差异(大坑)
MySQL:数据库database 达梦:实例 -> 模式 (SCHEMA)
- MySQL 创建 database → 达梦一般创建用户(用户 = 模式)
- 不要习惯写
use db;,MyBatis 里表名尽量带上模式名SCHEMA.TABLE
二、分页语法(最常见改造点)
MySQL
sql
select * from user limit 10,20;
达梦两种写法
- 兼容写法(推荐,不用改代码)
sql
select * from user limit 20 offset 10;
- 达梦原生 rownum(类似 Oracle)
sql
select * from (select t.*,rownum rn from user t where rownum <=30) where rn>10;
MyBatis-Plus:新版本已适配达梦分页方言,只需更换数据库方言。
三、常用函数不兼容清单(高频踩坑)
表格
| MySQL 函数 | 达梦替代方案 |
|---|---|
ifnull(col,val) |
nvl(col,val);达梦也兼容 ifnull,优先 nvl |
if(条件,a,b) |
decode(条件,1,a,b) / case when |
date_format(now(),'%Y-%m-%d') |
to_char(sysdate,'yyyy-mm-dd') |
now() / sysdate() |
sysdate |
curdate() |
trunc(sysdate) |
concat_ws(',',a,b,c) |
concat + case,达梦无 concat_ws |
find_in_set(val,strlist) |
需要自定义函数实现,达梦原生没有 |
group_concat() |
wm_concat()(注意:返回 clob,程序要处理) |
substring_index |
无原生函数,需自定义 |
重点预警:group_concat 是迁移重灾区
四、数据类型差异
表格
| MySQL | 达梦对应 | 注意事项 |
|---|---|---|
| VARCHAR(n) | VARCHAR(n) | 字符单位,达梦默认按字符,和 MySQL8 一致 |
| TINYINT (1) 布尔 | TINYINT / BIT | Mybatis 布尔映射注意 |
| DATETIME | DATETIME | 支持;0000-00-00 达梦不允许!! |
| TIMESTAMP | TIMESTAMP | 范围不一样 |
| TEXT | TEXT / CLOB | 大文本推荐 CLOB |
| BIGINT | BIGINT | 兼容 |
致命坑: MySQL 允许 '0000-00-00 00:00:00',达梦直接报错。 历史脏数据必须清理,或者程序设置默认值为 null。
五、SQL 语法差异
- 自增主键 MySQL:
id bigint auto_increment primary key达梦支持两种:
sql
-- 方式1 兼容auto_increment(推荐迁移使用)
id bigint auto_increment primary key
-- 方式2 序列+触发器(传统模式)
-
表别名不能加 as(部分版本兼容,但谨慎) ✅
select t.id from user t❌select t.id from user as t(Oracle / 达梦风格容易踩坑) -
insert ... on duplicate key update 达梦不支持! MySQL 经典幂等插入语句必须改造: 方案:先查询,存在则 update,不存在 insert;或使用 MERGE INTO。
sql
merge into t_user t
using (select ? id,? name from dual) s
on (t.id = s.id)
when matched then update set name=s.name
when not matched then insert(id,name) values(s.id,s.name);
-
select ... into outfile达梦不支持,导出用 dexp 工具;导入 dimp。 -
注释:
#单行注释达梦不识别,统一改成--
六、框架层改造(SpringBoot/MyBatis/MyBatis-Plus)
- 数据库方言
- MyBatis-Plus:
yaml
mybatis-plus:
configuration:
db-config:
db-type: dm
旧项目如果自定义分页插件,必须适配达梦分页。
- 字段名大小写
- MySQL 默认不区分表名字段大小写
- 达梦:创建不加双引号默认大写!
sql
-- 建表不加"",字段存为大写
create table t_user(name varchar(100));
-- 查询小写name会找不到,必须大写或者规范写法
select NAME from t_user;
最佳实践:建表脚本统一大写,或者创建时加双引号保留大小写。
- 保留关键字 USER、LEVEL、TYPE、POSITION 等很多关键字,字段名尽量避免,或者用双引号包裹
"TYPE"。
七、事务、锁、SQL 特殊行为
- MySQL 默认隔离级别 REPEATABLE-READ;达梦默认也是,但锁机制和 MVCC 细节不同。
- MySQL
limit可以 update/delete;达梦update ... limit不支持,需要改写。
sql
-- MySQL
delete from t_user limit 10;
-- 达梦改写
delete from t_user where id in (select id from t_user limit 10);
八、运维 & 脚本改造
- 备份工具 mysqldump → dexp mysqlsource → dimp
- 权限语句
grant all on db.* to user语法不同,达梦按模式授权 - 没有 show databases/show tables 查询库:
select distinct table_name,owner from dba_tables
九、简易迁移实施顺序(落地步骤)
- 替换 JDBC 驱动、连接串、测试连通性
- DDL 脚本改造:自增、字段默认时间、移除 #注释
- 检索项目 SQL,重点整改:
- limit 分页
- group_concat
- insert ... on duplicate key
- date_format、if、find_in_set
- 处理日期
0000-00-00脏数据 - MyBatis 分页方言适配
- 功能全量回归测试
- 存储过程 / 触发器(如有)重点改造,语法差异巨大
十、环境额外提醒(信创 ARM)
银河麒麟 aarch64 部署达梦:
- 必须下载 DM8 aarch64 安装包
- JDK 也要 aarch64 版本,否则驱动异常
- 达梦安装、初始化实例参数和 x86 大体一致,但安装包不能混用
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)