MySql/Oracle数据库项目改造适配信创国产数据库的方法详解

 更新时间:2025年11月18日 11:25:56   作者:28_鬼鬼  
项目里用了MySQL数据库,现在要换成国产信创数据库,很多团队都在头疼这个问题,这篇文章主要介绍了MySql/Oracle数据库项目改造适配信创国产数据库的相关资料,文中介绍的非常详细,需要的朋友可以参考下

一、总体兼容性概览

数据库兼容模式Oracle 兼容度MySQL 兼容度备注
达梦 DMOracle 模式 / MySQL 模式★★★★☆(高)★★☆☆☆(低)默认 Oracle 模式,语法最接近 Oracle
人大金仓 KingbaseESOracle / PostgreSQL 模式★★★★☆★★☆☆☆基于 PostgreSQL,Oracle 模式较成熟
神通 OSCAROracle 模式为主★★★★☆★★☆☆☆宣称高度兼容 Oracle
华为 GaussDBOracle 模式 / MySQL 模式★★★★★(极高)★★★★☆(高)企业级,兼容性最好,支持语法转换工具
  • 从 Oracle 迁移 → 优先选 GaussDB 或 达梦
  • 从 MySQL 迁移 → 优先选 GaussDB(MySQL 模式)
  • 基于开源生态 → 选 KingbaseES(PostgreSQL 基础)

具体语法差异详解

数据定义语言(DDL)

① 创建表与字段类型

功能OracleMySQL达梦 DM人大金仓 KingbaseES神通 OSCARGaussDB(Oracle模式)
自增主键SEQUENCE + TRIGGERAUTO_INCREMENTIDENTITY(1,1)SERIAL 或 GENERATED BY DEFAULT AS IDENTITYIDENTITY(1,1)GENERATED BY DEFAULT AS IDENTITY 或序列
CLOB 类型CLOBLONGTEXTTEXT 或 CLOBTEXTCLOBCLOB
BLOB 类型BLOBLONGBLOBBLOBBYTEABLOBBLOB
日期类型DATEDATETIMEDATETIMESTAMPDATEDATE
默认值当前时间SYSDATENOW()SYSDATE 或 CURRENT_TIMESTAMPCURRENT_TIMESTAMPSYSDATESYSDATE
表空间指定TABLESPACE xxx不支持TABLESPACE xxxTABLESPACE xxxTABLESPACE xxxTABLESPACE xxx

📌 注意

  • 达梦、神通、GaussDB 在 Oracle 模式下支持 VARCHAR2,KingbaseES 不支持(用 VARCHAR)。
  • MySQL 的 ENGINE=InnoDB 在国产库中无效,需删除。

数据操作语言(DML) & 查询语法

① 分页查询(最常见差异!)

数据库分页语法
OracleSELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ?
MySQLLIMIT ? OFFSET ?
达梦 DMLIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle)
KingbaseESLIMIT ? OFFSET ? (PostgreSQL 语法)
神通 OSCARLIMIT ? OFFSET ? 或 ROWNUM
GaussDBLIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式)

建议:统一使用 LIMIT m OFFSET n,GaussDB/达梦/神通都支持。若用 MyBatis-Plus,可配置方言自动适配。

② 字符串连接

数据库语法
Oracle`'a'
MySQLCONCAT('a','b')
达梦`
KingbaseES`
神通`
GaussDB`

③ NVL / IFNULL / COALESCE

数据库NULL 替换函数
OracleNVL(expr1, expr2)
MySQLIFNULL(expr1, expr2)
达梦NVL
KingbaseESCOALESCE(推荐)
神通NVL
GaussDBNVL(Oracle 模式)

✅ 建议统一使用标准 COALESCE(expr1, expr2, ...),所有数据库都支持。

函数差异

① 日期函数

功能OracleMySQL达梦KingbaseES神通GaussDB
当前日期时间SYSDATENOW()SYSDATECURRENT_TIMESTAMPSYSDATESYSDATE
格式化日期TO_CHAR(date, 'YYYY-MM-DD')DATE_FORMAT(date, '%Y-%m-%d')TO_CHARTO_CHARTO_CHARTO_CHAR
日期加减date + 1DATE_ADD(date, INTERVAL 1 DAY)date + 1date + INTERVAL '1 day'date + 1date + 1

📌 KingbaseES 基于 PG,日期运算需用 INTERVAL,与其他库差异较大。

具体语法差异详解

数据定义语言(DDL)

① 创建表与字段类型

功能OracleMySQL达梦 DM人大金仓 KingbaseES神通 OSCARGaussDB(Oracle模式)
自增主键SEQUENCE + TRIGGERAUTO_INCREMENTIDENTITY(1,1)SERIAL 或 GENERATED BY DEFAULT AS IDENTITYIDENTITY(1,1)GENERATED BY DEFAULT AS IDENTITY 或序列
CLOB 类型CLOBLONGTEXTTEXT 或 CLOBTEXTCLOBCLOB
BLOB 类型BLOBLONGBLOBBLOBBYTEABLOBBLOB
日期类型DATEDATETIMEDATETIMESTAMPDATEDATE
默认值当前时间SYSDATENOW()SYSDATE 或 CURRENT_TIMESTAMPCURRENT_TIMESTAMPSYSDATESYSDATE
表空间指定TABLESPACE xxx不支持TABLESPACE xxxTABLESPACE xxxTABLESPACE xxxTABLESPACE xxx

📌 注意

  • 达梦、神通、GaussDB 在 Oracle 模式下支持 VARCHAR2,KingbaseES 不支持(用 VARCHAR)。
  • MySQL 的 ENGINE=InnoDB 在国产库中无效,需删除。

数据操作语言(DML) & 查询语法

① 分页查询(最常见差异!)

数据库分页语法
OracleSELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ?
MySQLLIMIT ? OFFSET ?
达梦 DMLIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle)
KingbaseESLIMIT ? OFFSET ? (PostgreSQL 语法)
神通 OSCARLIMIT ? OFFSET ? 或 ROWNUM
GaussDBLIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式)

建议:统一使用 LIMIT m OFFSET n,GaussDB/达梦/神通都支持。若用 MyBatis-Plus,可配置方言自动适配。

② 字符串连接

数据库语法
Oracle`'a'
MySQLCONCAT('a','b')
达梦`
KingbaseES`
神通`
GaussDB`

③ NVL / IFNULL / COALESCE

数据库NULL 替换函数
OracleNVL(expr1, expr2)
MySQLIFNULL(expr1, expr2)
达梦NVL
KingbaseESCOALESCE(推荐)
神通NVL
GaussDBNVL(Oracle 模式)

✅ 建议统一使用标准 COALESCE(expr1, expr2, ...),所有数据库都支持。

函数差异

① 日期函数

功能OracleMySQL达梦KingbaseES神通GaussDB
当前日期时间SYSDATENOW()SYSDATECURRENT_TIMESTAMPSYSDATESYSDATE
格式化日期TO_CHAR(date, 'YYYY-MM-DD')DATE_FORMAT(date, '%Y-%m-%d')TO_CHARTO_CHARTO_CHARTO_CHAR
日期加减date + 1DATE_ADD(date, INTERVAL 1 DAY)date + 1date + INTERVAL '1 day'date + 1date + 1

📌 KingbaseES 基于 PG,日期运算需用 INTERVAL,与其他库差异较大。

系统视图 & 元数据查询

查询表结构:

数据库查询表字段语句(示例)
OracleSELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'
MySQLDESC table_name 或 SHOW COLUMNS FROM table_name
达梦SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'(兼容 Oracle)
KingbaseESSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xxx'(PG 风格)
神通SELECT * FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS c WHERE ...(私有视图,文档较少)
GaussDBSELECT * 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。
  • 文档和工具链较弱,社区支持少。
  • 对 ROWNUMDUALSYSDATE 支持良好。

④ 华为高斯(GaussDB)

  • 支持“Oracle 兼容模式”和“MySQL 兼容模式”,启动时指定。
  • 提供 SQL翻译器(SQL Transform Tool),自动转换 Oracle/MySQL 语法。
  • 支持分布式事务、全局时间戳(适合金融级应用)。
  • 企业级功能最完善,但授权费用高。

三、迁移建议与工具

通用迁移策略:

  1. SQL 语法标准化

    • 用 COALESCE 代替 NVL/IFNULL
    • 用 LIMIT/OFFSET 代替 ROWNUM
    • 避免使用数据库私有函数(如 Oracle 的 DECODE → 改用 CASE WHEN
  2. 使用方言插件
    • MyBatis-Plus:内置达梦、人大金仓、GaussDB 方言
    • JPA/Hibernate:配置对应 Dialect
  3. GaussDB SQL翻译工具(强烈推荐):

    • 华为提供 GUI 工具,可批量转换 Oracle/MySQL 脚本 → GaussDB
    • 自动处理函数、分页、类型等差异

四、总结对比表(快速查阅)

特性OracleMySQL达梦人大金仓神通GaussDB
分页ROWNUMLIMITLIMIT/ROWNUMLIMITLIMIT/ROWNUMLIMIT/ROWNUM
自增主键序列+触发器AUTO_INCREMENTIDENTITYSERIALIDENTITYIDENTITY/序列
字符串连接||CONCAT||||||||
NULL处理NVLIFNULLNVLCOALESCENVLNVL
日期函数TO_CHARDATE_FORMATTO_CHARTO_CHARTO_CHARTO_CHAR
元数据视图USER_%INFORMATION_SCHEMAUSER_%INFORMATION_SCHEMASYS.%USER_%
大小写敏感否(大写存)是(按创建)否(可配置)是(小写存)否(可配置)
DUAL表❌(需建)
企业级支持✅✅✅

最佳实践建议

  1. 新项目选型

    • 金融/电信/政企 → GaussDB
    • 信创替代 Oracle → 达梦 或 神通
    • 开源生态/云原生 → 人大金仓
  2. 老系统迁移

    • 从 Oracle → 优先 GaussDB(兼容最好),次选达梦
    • 从 MySQL → 优先 GaussDB(MySQL 模式),次选人大金仓
  3. 开发规范

    • 避免使用数据库私有语法
    • 使用标准 SQL + 多方言适配
    • 抽象 DAO 层,隔离数据库差异
  4. 测试验证

    • 必须做全量 SQL 回归测试
    • 验证分页、函数、事务、性能

总结 

到此这篇关于MySql/Oracle数据库项目改造适配信创国产数据库的文章就介绍到这了,更多相关MySql/Oracle改造适配信创国产数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在MySQL中不建议使用长事务的根因详析

    在MySQL中不建议使用长事务的根因详析

    长事务顾名思义就是运行时间比较长,长时间未提交的事务,也可以称之为大事务,这类事务往往会造成大量的阻塞和锁超时,容易造成主从延迟,要尽量避免使用长事务,这篇文章主要介绍了在MySQL中不建议使用长事务根因的相关资料,需要的朋友可以参考下
    2025-12-12
  • MySQL数据库中Interval关键字的使用看这一篇就够了

    MySQL数据库中Interval关键字的使用看这一篇就够了

    这篇文章主要给大家介绍了关于MySQL数据库中Interval关键字使用的相关资料,interval作为一个关键字时,表示为时间间隔,常用在date_add()、date_sub()、subdate(),函数中,常用于时间的加减法,需要的朋友可以参考下
    2024-08-08
  • mysql临时表插入数据方式

    mysql临时表插入数据方式

    这篇文章主要介绍了mysql临时表插入数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Mysql连接本地报错:1130-host ... is not allowed to connect to this MySQL server解决

    Mysql连接本地报错:1130-host ... is not allowed to connect t

    这篇文章主要给大家介绍了关于Mysql连接本地报错:1130-host ... is not allowed to connect to this MySQL server的解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 为mysql数据库添加添加事务处理的方法

    为mysql数据库添加添加事务处理的方法

    开始首先说明一下,mysql数据库默认的数据库引擎是MyISAM,是不支持事务的,单数如果你添加了数据执行语句是不会出错的,单数不管用,即便是回滚事务,记录也是插入进去了,所有首先我们要做的第一步是更改数据库引擎
    2011-07-07
  • mysql索引原理与用法实例分析

    mysql索引原理与用法实例分析

    这篇文章主要介绍了mysql索引原理与用法,结合实例形式分析了mysql索引的基本概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • mysql(5.6及以下)解析json的方法实例详解

    mysql(5.6及以下)解析json的方法实例详解

    这篇文章主要介绍了mysql(5.6及以下)解析json的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • mysql 5.7 的 /etc/my.cnf 参数介绍

    mysql 5.7 的 /etc/my.cnf 参数介绍

    这篇文章主要介绍了mysql 5.7 的 /etc/my.cnf 参数介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • MySQL插入emoji表情失败问题的解决方法

    MySQL插入emoji表情失败问题的解决方法

    emoji表情在我们日常开发中经常会遇到,但是最近在mysql中插入emoji表情遇到了问题,通过查找相关的资料终于解决了,所以将这次解决的过程分享出来,这篇文章主要就给大家介绍了MySQL插入emoji表情失败问题的解决方法,需要的朋友可以参考。
    2017-05-05
  • MySQL索引操作命令小结

    MySQL索引操作命令小结

    这篇文章主要介绍了MySQL索引操作命令小结,本文讲解了创建索引、查询索引、删除索引等内容,需要的朋友可以参考下
    2014-12-12

最新评论