MySql/Oracle數(shù)據(jù)庫項目改造適配信創(chuàng)國產(chǎn)數(shù)據(jù)庫的方法詳解
一、總體兼容性概覽
| 數(shù)據(jù)庫 | 兼容模式 | Oracle 兼容度 | MySQL 兼容度 | 備注 |
|---|---|---|---|---|
| 達(dá)夢 DM | Oracle 模式 / MySQL 模式 | ★★★★☆(高) | ★★☆☆☆(低) | 默認(rèn) Oracle 模式,語法最接近 Oracle |
| 人大金倉 KingbaseES | Oracle / PostgreSQL 模式 | ★★★★☆ | ★★☆☆☆ | 基于 PostgreSQL,Oracle 模式較成熟 |
| 神通 OSCAR | Oracle 模式為主 | ★★★★☆ | ★★☆☆☆ | 宣稱高度兼容 Oracle |
| 華為 GaussDB | Oracle 模式 / MySQL 模式 | ★★★★★(極高) | ★★★★☆(高) | 企業(yè)級,兼容性最好,支持語法轉(zhuǎn)換工具 |
- 從 Oracle 遷移 → 優(yōu)先選 GaussDB 或 達(dá)夢
- 從 MySQL 遷移 → 優(yōu)先選 GaussDB(MySQL 模式)
- 基于開源生態(tài) → 選 KingbaseES(PostgreSQL 基礎(chǔ))
具體語法差異詳解
數(shù)據(jù)定義語言(DDL)
① 創(chuàng)建表與字段類型
| 功能 | Oracle | MySQL | 達(dá)夢 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 |
| 默認(rèn)值當(dāng)前時間 | SYSDATE | NOW() | SYSDATE 或 CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 表空間指定 | TABLESPACE xxx | 不支持 | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx |
?? 注意:
- 達(dá)夢、神通、GaussDB 在 Oracle 模式下支持
VARCHAR2,KingbaseES 不支持(用VARCHAR)。 - MySQL 的
ENGINE=InnoDB在國產(chǎn)庫中無效,需刪除。
數(shù)據(jù)操作語言(DML) & 查詢語法
① 分頁查詢(最常見差異?。?/h4>
| 數(shù)據(jù)庫 | 分頁語法 |
|---|---|
| Oracle | SELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ? |
| MySQL | LIMIT ? OFFSET ? |
| 達(dá)夢 DM | LIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle) |
| KingbaseES | LIMIT ? OFFSET ? (PostgreSQL 語法) |
| 神通 OSCAR | LIMIT ? OFFSET ? 或 ROWNUM |
| GaussDB | LIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式) |
? 建議:統(tǒng)一使用 LIMIT m OFFSET n,GaussDB/達(dá)夢/神通都支持。若用 MyBatis-Plus,可配置方言自動適配。
② 字符串連接
| 數(shù)據(jù)庫 | 語法 |
|---|---|
| Oracle | `'a' |
| MySQL | CONCAT('a','b') |
| 達(dá)夢 | ` |
| KingbaseES | ` |
| 神通 | ` |
| GaussDB | ` |
③ NVL / IFNULL / COALESCE
| 數(shù)據(jù)庫 | NULL 替換函數(shù) |
|---|---|
| Oracle | NVL(expr1, expr2) |
| MySQL | IFNULL(expr1, expr2) |
| 達(dá)夢 | NVL |
| KingbaseES | COALESCE(推薦) |
| 神通 | NVL |
| GaussDB | NVL(Oracle 模式) |
? 建議統(tǒng)一使用標(biāo)準(zhǔn) COALESCE(expr1, expr2, ...),所有數(shù)據(jù)庫都支持。
函數(shù)差異
① 日期函數(shù)
| 功能 | Oracle | MySQL | 達(dá)夢 | KingbaseES | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 當(dāng)前日期時間 | 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,與其他庫差異較大。
具體語法差異詳解
數(shù)據(jù)定義語言(DDL)
① 創(chuàng)建表與字段類型
| 功能 | Oracle | MySQL | 達(dá)夢 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 |
| 默認(rèn)值當(dāng)前時間 | SYSDATE | NOW() | SYSDATE 或 CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | SYSDATE | SYSDATE |
| 表空間指定 | TABLESPACE xxx | 不支持 | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx | TABLESPACE xxx |
?? 注意:
- 達(dá)夢、神通、GaussDB 在 Oracle 模式下支持
VARCHAR2,KingbaseES 不支持(用VARCHAR)。 - MySQL 的
ENGINE=InnoDB在國產(chǎn)庫中無效,需刪除。
數(shù)據(jù)操作語言(DML) & 查詢語法
① 分頁查詢(最常見差異?。?/h4>
| 數(shù)據(jù)庫 | 分頁語法 |
|---|---|
| Oracle | SELECT * FROM (SELECT ROWNUM rn, t.* FROM tab t WHERE ROWNUM <= ?) WHERE rn > ? |
| MySQL | LIMIT ? OFFSET ? |
| 達(dá)夢 DM | LIMIT ? OFFSET ? 或 ROWNUM(兼容 Oracle) |
| KingbaseES | LIMIT ? OFFSET ? (PostgreSQL 語法) |
| 神通 OSCAR | LIMIT ? OFFSET ? 或 ROWNUM |
| GaussDB | LIMIT ? OFFSET ? 或 ROWNUM(Oracle 模式) |
? 建議:統(tǒng)一使用 LIMIT m OFFSET n,GaussDB/達(dá)夢/神通都支持。若用 MyBatis-Plus,可配置方言自動適配。
② 字符串連接
| 數(shù)據(jù)庫 | 語法 |
|---|---|
| Oracle | `'a' |
| MySQL | CONCAT('a','b') |
| 達(dá)夢 | ` |
| KingbaseES | ` |
| 神通 | ` |
| GaussDB | ` |
③ NVL / IFNULL / COALESCE
| 數(shù)據(jù)庫 | NULL 替換函數(shù) |
|---|---|
| Oracle | NVL(expr1, expr2) |
| MySQL | IFNULL(expr1, expr2) |
| 達(dá)夢 | NVL |
| KingbaseES | COALESCE(推薦) |
| 神通 | NVL |
| GaussDB | NVL(Oracle 模式) |
? 建議統(tǒng)一使用標(biāo)準(zhǔn) COALESCE(expr1, expr2, ...),所有數(shù)據(jù)庫都支持。
函數(shù)差異
① 日期函數(shù)
| 功能 | Oracle | MySQL | 達(dá)夢 | KingbaseES | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 當(dāng)前日期時間 | 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,與其他庫差異較大。
系統(tǒng)視圖 & 元數(shù)據(jù)查詢
查詢表結(jié)構(gòu):
| 數(shù)據(jù)庫 | 查詢表字段語句(示例) |
|---|---|
| Oracle | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX' |
| MySQL | DESC table_name 或 SHOW COLUMNS FROM table_name |
| 達(dá)夢 | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'(兼容 Oracle) |
| KingbaseES | SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xxx'(PG 風(fēng)格) |
| 神通 | SELECT * FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS c WHERE ...(私有視圖,文檔較少) |
| GaussDB | SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'XXX'(Oracle 模式) |
? 建議:
- Oracle/達(dá)夢/GaussDB 可共用一套元數(shù)據(jù)查詢語句。
- KingbaseES 使用標(biāo)準(zhǔn)
INFORMATION_SCHEMA。 - 神通需查閱私有字典表,遷移成本高。
特殊語法/限制
① 達(dá)夢(DM)
- 默認(rèn)不區(qū)分大小寫(可配置),對象名大寫存儲。
- 支持
DUAL表(兼容 Oracle)。 - 分頁推薦
LIMIT m OFFSET n。 - 不支持
CREATE OR REPLACE VIEW,需先DROP。
② 人大金倉(KingbaseES)
- 基于 PostgreSQL,大小寫敏感,對象名小寫存儲(除非雙引號)。
- 不支持
VARCHAR2,用VARCHAR。 - 支持窗口函數(shù)、CTE,功能強大。
- 序列使用
nextval('seq_name')。
③ 神通(OSCAR)
- 語法最接近 Oracle。
- 文檔和工具鏈較弱,社區(qū)支持少。
- 對
ROWNUM、DUAL、SYSDATE支持良好。
④ 華為高斯(GaussDB)
- 支持“Oracle 兼容模式”和“MySQL 兼容模式”,啟動時指定。
- 提供 SQL翻譯器(SQL Transform Tool),自動轉(zhuǎn)換 Oracle/MySQL 語法。
- 支持分布式事務(wù)、全局時間戳(適合金融級應(yīng)用)。
- 企業(yè)級功能最完善,但授權(quán)費用高。
三、遷移建議與工具
通用遷移策略:
SQL 語法標(biāo)準(zhǔn)化:
- 用
COALESCE代替NVL/IFNULL - 用
LIMIT/OFFSET代替ROWNUM - 避免使用數(shù)據(jù)庫私有函數(shù)(如 Oracle 的
DECODE→ 改用CASE WHEN)
- 用
- 使用方言插件:
- MyBatis-Plus:內(nèi)置達(dá)夢、人大金倉、GaussDB 方言
- JPA/Hibernate:配置對應(yīng)
Dialect
GaussDB SQL翻譯工具(強烈推薦):
- 華為提供 GUI 工具,可批量轉(zhuǎn)換 Oracle/MySQL 腳本 → GaussDB
- 自動處理函數(shù)、分頁、類型等差異
四、總結(jié)對比表(快速查閱)
| 特性 | Oracle | MySQL | 達(dá)夢 | 人大金倉 | 神通 | GaussDB |
|---|---|---|---|---|---|---|
| 分頁 | ROWNUM | LIMIT | LIMIT/ROWNUM | LIMIT | LIMIT/ROWNUM | LIMIT/ROWNUM |
| 自增主鍵 | 序列+觸發(fā)器 | AUTO_INCREMENT | IDENTITY | SERIAL | IDENTITY | IDENTITY/序列 |
| 字符串連接 | || | CONCAT | || | || | || | || |
| NULL處理 | NVL | IFNULL | NVL | COALESCE | NVL | NVL |
| 日期函數(shù) | TO_CHAR | DATE_FORMAT | TO_CHAR | TO_CHAR | TO_CHAR | TO_CHAR |
| 元數(shù)據(jù)視圖 | USER_% | INFORMATION_SCHEMA | USER_% | INFORMATION_SCHEMA | SYS.% | USER_% |
| 大小寫敏感 | 否(大寫存) | 是(按創(chuàng)建) | 否(可配置) | 是(小寫存) | 否 | 否(可配置) |
| DUAL表 | ? | ? | ? | ?(需建) | ? | ? |
| 企業(yè)級支持 | ? | ? | ? | ? | ? | ??? |
最佳實踐建議
新項目選型:
- 金融/電信/政企 → GaussDB
- 信創(chuàng)替代 Oracle → 達(dá)夢 或 神通
- 開源生態(tài)/云原生 → 人大金倉
老系統(tǒng)遷移:
- 從 Oracle → 優(yōu)先 GaussDB(兼容最好),次選達(dá)夢
- 從 MySQL → 優(yōu)先 GaussDB(MySQL 模式),次選人大金倉
開發(fā)規(guī)范:
- 避免使用數(shù)據(jù)庫私有語法
- 使用標(biāo)準(zhǔn) SQL + 多方言適配
- 抽象 DAO 層,隔離數(shù)據(jù)庫差異
測試驗證:
- 必須做全量 SQL 回歸測試
- 驗證分頁、函數(shù)、事務(wù)、性能
總結(jié)
到此這篇關(guān)于MySql/Oracle數(shù)據(jù)庫項目改造適配信創(chuàng)國產(chǎn)數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)MySql/Oracle改造適配信創(chuàng)國產(chǎn)數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中的binlog相關(guān)命令和恢復(fù)技巧
這篇文章主要介紹了MySQL中的binlog相關(guān)命令和恢復(fù)技巧,需要的朋友可以參考下2014-05-05
64位 win10系統(tǒng)安裝綠色版mysql-5.7.16-winx64的教程
這篇文章主要介紹了64位 win10系統(tǒng)安裝綠色版mysql-5.7.16-winx64的教程,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10
Navicat連接遠(yuǎn)程服務(wù)器里docker中mysql的方法(已解決)
相信大家都有在遠(yuǎn)程服務(wù)器上進(jìn)行開發(fā)吧,其中MySQL的使用率應(yīng)該也會挺高,這篇文章主要給大家介紹了關(guān)于Navicat連接遠(yuǎn)程服務(wù)器里docker中mysql的相關(guān)資料,需要的朋友可以參考下2024-04-04

