MySql/Oracle数据库项目改造适配信创国产数据库的方法详解
作者:28_鬼鬼
项目里用了MySQL数据库,现在要换成国产信创数据库,很多团队都在头疼这个问题,这篇文章主要介绍了MySql/Oracle数据库项目改造适配信创国产数据库的相关资料,文中介绍的非常详细,需要的朋友可以参考下
一、总体兼容性概览
| 数据库 | 兼容模式 | Oracle 兼容度 | MySQL 兼容度 | 备注 |
|---|---|---|---|---|
| 达梦 DM | Oracle 模式 / MySQL 模式 | ★★★★☆(高) | ★★☆☆☆(低) | 默认 Oracle 模式,语法最接近 Oracle |
| 人大金仓 KingbaseES | Oracle / PostgreSQL 模式 | ★★★★☆ | ★★☆☆☆ | 基于 PostgreSQL,Oracle 模式较成熟 |
| 神通 OSCAR | Oracle 模式为主 | ★★★★☆ | ★★☆☆☆ | 宣称高度兼容 Oracle |
| 华为 GaussDB | Oracle 模式 / MySQL 模式 | ★★★★★(极高) | ★★★★☆(高) | 企业级,兼容性最好,支持语法转换工具 |
- 从 Oracle 迁移 → 优先选 GaussDB 或 达梦
- 从 MySQL 迁移 → 优先选 GaussDB(MySQL 模式)
- 基于开源生态 → 选 KingbaseES(PostgreSQL 基础)
具体语法差异详解
数据定义语言(DDL)
① 创建表与字段类型
| 功能 | Oracle | MySQL | 达梦 DM | 人大金仓 KingbaseES | 神通 OSCAR | GaussDB(Oracle模式) |
|---|---|---|---|---|---|---|
| 自增主键 | SEQUENCE + TRIGGER | AUTO_INCREMENT | IDENTITY(1,1) | SERIAL 或 GENERATED BY DEFAULT AS IDENTITY | IDENTITY(1,1) | GENERATED BY DEFAULT AS IDENTITY 或序列 |
| CLOB 类型 | CLOB | LONGTEXT | TEXT 或 CLOB | TEXT | CLOB | CLOB |
| BLOB 类型 | BLOB | LONGBLOB | BLOB | BYTEA | BLOB | BLOB |
| 日期类型 | DATE | DATETIME | DATE | TIMESTAMP | DATE | DATE |
| 默认值当前时间 | SYSDATE | NOW() | SYSDATE 或 CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 表空间指定 | TABLESPACE xxx | 不支持 | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx |
📌 注意:
- 达梦、神通、GaussDB 在 Oracle 模式下支持
VARCHAR2,KingbaseES 不支持(用VARCHAR)。 - MySQL 的
ENGINE=InnoDB在国产库中无效,需删除。
数据操作语言(DML) & 查询语法
① 分页查询(最常见差异!)
| 数据库 | 分页语法 |
|---|---|
| Oracle | SELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ? |
| MySQL | LIMIT ? OFFSET ? |
| 达梦 DM | LIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle) |
| KingbaseES | LIMIT ? OFFSET ? (PostgreSQL 语法) |
| 神通 OSCAR | LIMIT ? OFFSET ? 或 ROWNUM |
| GaussDB | LIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式) |
✅ 建议:统一使用 LIMIT m OFFSET n,GaussDB/达梦/神通都支持。若用 MyBatis-Plus,可配置方言自动适配。
② 字符串连接
| 数据库 | 语法 |
|---|---|
| Oracle | `'a' |
| MySQL | CONCAT('a','b') |
| 达梦 | ` |
| KingbaseES | ` |
| 神通 | ` |
| GaussDB | ` |
③ NVL / IFNULL / COALESCE
| 数据库 | NULL 替换函数 |
|---|---|
| Oracle | NVL(expr1, expr2) |
| MySQL | IFNULL(expr1, expr2) |
| 达梦 | NVL |
| KingbaseES | COALESCE(推荐) |
| 神通 | NVL |
| GaussDB | NVL(Oracle 模式) |
✅ 建议统一使用标准 COALESCE(expr1, expr2, ...),所有数据库都支持。
函数差异
① 日期函数
| 功能 | Oracle | MySQL | 达梦 | KingbaseES | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 当前日期时间 | SYSDATE | NOW() | SYSDATE | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 格式化日期 | TO_CHAR(date, 'YYYY-MM-DD') | DATE_FORMAT(date, '%Y-%m-%d') | TO_CHAR | TO_CHAR | TO_CHAR | TO_CHAR |
| 日期加减 | date + 1 | DATE_ADD(date, INTERVAL 1 DAY) | date + 1 | date + INTERVAL '1 day' | date + 1 | date + 1 |
📌 KingbaseES 基于 PG,日期运算需用 INTERVAL,与其他库差异较大。
具体语法差异详解
数据定义语言(DDL)
① 创建表与字段类型
| 功能 | Oracle | MySQL | 达梦 DM | 人大金仓 KingbaseES | 神通 OSCAR | GaussDB(Oracle模式) |
|---|---|---|---|---|---|---|
| 自增主键 | SEQUENCE + TRIGGER | AUTO_INCREMENT | IDENTITY(1,1) | SERIAL 或 GENERATED BY DEFAULT AS IDENTITY | IDENTITY(1,1) | GENERATED BY DEFAULT AS IDENTITY 或序列 |
| CLOB 类型 | CLOB | LONGTEXT | TEXT 或 CLOB | TEXT | CLOB | CLOB |
| BLOB 类型 | BLOB | LONGBLOB | BLOB | BYTEA | BLOB | BLOB |
| 日期类型 | DATE | DATETIME | DATE | TIMESTAMP | DATE | DATE |
| 默认值当前时间 | SYSDATE | NOW() | SYSDATE 或 CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 表空间指定 | TABLESPACE xxx | 不支持 | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx |
📌 注意:
- 达梦、神通、GaussDB 在 Oracle 模式下支持
VARCHAR2,KingbaseES 不支持(用VARCHAR)。 - MySQL 的
ENGINE=InnoDB在国产库中无效,需删除。
数据操作语言(DML) & 查询语法
① 分页查询(最常见差异!)
| 数据库 | 分页语法 |
|---|---|
| Oracle | SELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ? |
| MySQL | LIMIT ? OFFSET ? |
| 达梦 DM | LIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle) |
| KingbaseES | LIMIT ? OFFSET ? (PostgreSQL 语法) |
| 神通 OSCAR | LIMIT ? OFFSET ? 或 ROWNUM |
| GaussDB | LIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式) |
✅ 建议:统一使用 LIMIT m OFFSET n,GaussDB/达梦/神通都支持。若用 MyBatis-Plus,可配置方言自动适配。
② 字符串连接
| 数据库 | 语法 |
|---|---|
| Oracle | `'a' |
| MySQL | CONCAT('a','b') |
| 达梦 | ` |
| KingbaseES | ` |
| 神通 | ` |
| GaussDB | ` |
③ NVL / IFNULL / COALESCE
| 数据库 | NULL 替换函数 |
|---|---|
| Oracle | NVL(expr1, expr2) |
| MySQL | IFNULL(expr1, expr2) |
| 达梦 | NVL |
| KingbaseES | COALESCE(推荐) |
| 神通 | NVL |
| GaussDB | NVL(Oracle 模式) |
✅ 建议统一使用标准 COALESCE(expr1, expr2, ...),所有数据库都支持。
函数差异
① 日期函数
| 功能 | Oracle | MySQL | 达梦 | KingbaseES | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 当前日期时间 | SYSDATE | NOW() | SYSDATE | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 格式化日期 | TO_CHAR(date, 'YYYY-MM-DD') | DATE_FORMAT(date, '%Y-%m-%d') | TO_CHAR | TO_CHAR | TO_CHAR | TO_CHAR |
| 日期加减 | date + 1 | DATE_ADD(date, INTERVAL 1 DAY) | date + 1 | date + INTERVAL '1 day' | date + 1 | date + 1 |
📌 KingbaseES 基于 PG,日期运算需用 INTERVAL,与其他库差异较大。
系统视图 & 元数据查询
查询表结构:
| 数据库 | 查询表字段语句(示例) |
|---|---|
| Oracle | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX' |
| MySQL | DESC table_name 或 SHOW COLUMNS FROM table_name |
| 达梦 | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'(兼容 Oracle) |
| KingbaseES | SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xxx'(PG 风格) |
| 神通 | SELECT * FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS c WHERE ...(私有视图,文档较少) |
| GaussDB | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'(Oracle 模式) |
✅ 建议:
- Oracle/达梦/GaussDB 可共用一套元数据查询语句。
- KingbaseES 使用标准
INFORMATION_SCHEMA。 - 神通需查阅私有字典表,迁移成本高。
特殊语法/限制
① 达梦(DM)
- 默认不区分大小写(可配置),对象名大写存储。
- 支持
DUAL表(兼容 Oracle)。 - 分页推荐
LIMIT m OFFSET n。 - 不支持
CREATE OR REPLACE VIEW,需先DROP。
② 人大金仓(KingbaseES)
- 基于 PostgreSQL,大小写敏感,对象名小写存储(除非双引号)。
- 不支持
VARCHAR2,用VARCHAR。 - 支持窗口函数、CTE,功能强大。
- 序列使用
nextval('seq_name')。
③ 神通(OSCAR)
- 语法最接近 Oracle。
- 文档和工具链较弱,社区支持少。
- 对
ROWNUM、DUAL、SYSDATE支持良好。
④ 华为高斯(GaussDB)
- 支持“Oracle 兼容模式”和“MySQL 兼容模式”,启动时指定。
- 提供 SQL翻译器(SQL Transform Tool),自动转换 Oracle/MySQL 语法。
- 支持分布式事务、全局时间戳(适合金融级应用)。
- 企业级功能最完善,但授权费用高。
三、迁移建议与工具
通用迁移策略:
SQL 语法标准化:
- 用
COALESCE代替NVL/IFNULL - 用
LIMIT/OFFSET代替ROWNUM - 避免使用数据库私有函数(如 Oracle 的
DECODE→ 改用CASE WHEN)
- 用
- 使用方言插件:
- MyBatis-Plus:内置达梦、人大金仓、GaussDB 方言
- JPA/Hibernate:配置对应
Dialect
GaussDB SQL翻译工具(强烈推荐):
- 华为提供 GUI 工具,可批量转换 Oracle/MySQL 脚本 → GaussDB
- 自动处理函数、分页、类型等差异
四、总结对比表(快速查阅)
| 特性 | Oracle | MySQL | 达梦 | 人大金仓 | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 分页 | ROWNUM | LIMIT | LIMIT/ROWNUM | LIMIT | LIMIT/ROWNUM | LIMIT/ROWNUM |
| 自增主键 | 序列+触发器 | AUTO_INCREMENT | IDENTITY | SERIAL | IDENTITY | IDENTITY/序列 |
| 字符串连接 | || | CONCAT | || | || | || | || |
| NULL处理 | NVL | IFNULL | NVL | COALESCE | NVL | NVL |
| 日期函数 | TO_CHAR | DATE_FORMAT | TO_CHAR | TO_CHAR | TO_CHAR | TO_CHAR |
| 元数据视图 | USER_% | INFORMATION_SCHEMA | USER_% | INFORMATION_SCHEMA | SYS.% | USER_% |
| 大小写敏感 | 否(大写存) | 是(按创建) | 否(可配置) | 是(小写存) | 否 | 否(可配置) |
| DUAL表 | ✅ | ❌ | ✅ | ❌(需建) | ✅ | ✅ |
| 企业级支持 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅✅✅ |
最佳实践建议
新项目选型:
- 金融/电信/政企 → GaussDB
- 信创替代 Oracle → 达梦 或 神通
- 开源生态/云原生 → 人大金仓
老系统迁移:
- 从 Oracle → 优先 GaussDB(兼容最好),次选达梦
- 从 MySQL → 优先 GaussDB(MySQL 模式),次选人大金仓
开发规范:
- 避免使用数据库私有语法
- 使用标准 SQL + 多方言适配
- 抽象 DAO 层,隔离数据库差异
测试验证:
- 必须做全量 SQL 回归测试
- 验证分页、函数、事务、性能
总结
到此这篇关于MySql/Oracle数据库项目改造适配信创国产数据库的文章就介绍到这了,更多相关MySql/Oracle改造适配信创国产数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
