首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 遷移 Oracle 關鍵語法差異對照表與避坑指南

     編輯:MySQL 綜合教學

MySQL 轉 Oracle 必知的語法差異與遷移注意事項

專案需將資料庫從 MySQL 遷移至 Oracle 時,單純匯入資料遠遠不夠,SQL 語法、函數、保留字、分頁寫法等差異會導致應用程式大量報錯。本文整理最常踩的坑與對照表,助您順利完成遷移。

核心差異快速對照表

功能MySQLOracle備註
分頁查詢LIMIT offset, pageSize子查詢 + ROWNUM / ROW_NUMBER() OVER() (12c+)Oracle 需雙層子查詢控制範圍
日期格式化DATE_FORMAT(date, '%Y-%m-%d')TO_CHAR(date, 'YYYY-MM-DD')格式字串大小寫敏感
取得目前時間NOW() / SYSDATE()SYSDATE / CURRENT_TIMESTAMPOracle SYSDATE 無括號
字串串接CONCAT() / || (需 PIPES_AS_CONCAT)||MySQL 預設 || 為邏輯 OR
自動遞增欄位AUTO_INCREMENTSEQUENCE + Trigger / GENERATED AS IDENTITY (12c+)架構差異大
保留字衝突type, order, group 等非保留字上述皆為保留字Oracle 需雙引號 "TYPE" 或改名
大小寫敏感預設不敏感 (視 Collation)預設敏感 (識別字轉大寫)建議統一使用大寫識別字
空字串 vs NULL'' != NULL'' IS NULLOracle 視空字串為 NULL

實際遷移改寫範例

1. 分頁查詢改寫

-- MySQL
SELECT * FROM orders ORDER BY id DESC LIMIT 20, 10;

-- Oracle 11g/12c 通用寫法
SELECT * FROM (
  SELECT a.*, ROWNUM rn FROM (
    SELECT * FROM orders ORDER BY id DESC
  ) a WHERE ROWNUM <= 30
) WHERE rn > 20;

-- Oracle 12c+ 標準語法
SELECT * FROM orders ORDER BY id DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

2. 日期處理改寫

-- MySQL
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND DATE_FORMAT(create_time, '%Y-%m-%d') = '2023-01-01'

-- Oracle
WHERE create_time >= SYSDATE - 7
AND TO_CHAR(create_time, 'YYYY-MM-DD') = '2023-01-01'

3. 保留字處理

-- MySQL: type 可直接做欄位名
CREATE TABLE t (id INT, type VARCHAR(20));

-- Oracle: 必須雙引號 (且大小寫敏感)
CREATE TABLE t (id NUMBER, "TYPE" VARCHAR2(20));
-- 查詢時也要加雙引號
SELECT "TYPE" FROM t;

遷移檢查清單

  1. 全專案掃描 LIMIT、NOW()、DATE_FORMAT、AUTO_INCREMENT 等 MySQL 專有語法
  2. 檢查所有資料表/欄位名稱是否為 Oracle 保留字,需加雙引號或重命名
  3. 驗證日期、字串、數值函數呼叫相容性
  4. 調整交易隔離等級與鎖行為差異 (MySQL RR vs Oracle RC)
  5. 測試大量資料下的分頁、排序、關聯查詢效能
工具推薦: 可使用 SQLines、Ora2Pg、AWS SCT 等自動化遷移工具輔助轉換,但人工審核測試不可省略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved