Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySql/Oracle改造适配信创国产数据库

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

作者:28_鬼鬼

项目里用了MySQL数据库,现在要换成国产信创数据库,很多团队都在头疼这个问题,这篇文章主要介绍了MySql/Oracle数据库项目改造适配信创国产数据库的相关资料,文中介绍的非常详细,需要的朋友可以参考下

一、总体兼容性概览

数据库兼容模式Oracle 兼容度MySQL 兼容度备注
达梦 DMOracle 模式 / MySQL 模式★★★★☆(高)★★☆☆☆(低)默认 Oracle 模式,语法最接近 Oracle
人大金仓 KingbaseESOracle / PostgreSQL 模式★★★★☆★★☆☆☆基于 PostgreSQL,Oracle 模式较成熟
神通 OSCAROracle 模式为主★★★★☆★★☆☆☆宣称高度兼容 Oracle
华为 GaussDBOracle 模式 / MySQL 模式★★★★★(极高)★★★★☆(高)企业级,兼容性最好,支持语法转换工具

具体语法差异详解

数据定义语言(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

📌 注意

数据操作语言(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

📌 注意

数据操作语言(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 模式)

建议

特殊语法/限制

① 达梦(DM)

② 人大金仓(KingbaseES)

③ 神通(OSCAR)

④ 华为高斯(GaussDB)

三、迁移建议与工具

通用迁移策略:

  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改造适配信创国产数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文