首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 遷移 Oracle 完全指南:8 大核心差異與轉換方案

     編輯:MySQL 資料庫相關知識

1. 自增主鍵 → Sequence + Trigger

-- MySQL
id INT AUTO_INCREMENT PRIMARY KEY

-- Oracle
CREATE SEQUENCE seq_tbl_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE;
-- 插入時
INSERT INTO tbl (id, ...) VALUES (seq_tbl_id.NEXTVAL, ...);
-- 或建 BEFORE INSERT TRIGGER 自動填充

2. 字串引號:雙引號 → 單引號 + 轉義

MySQL 支援雙引號字串,Oracle **僅支援單引號**。
插入/更新前:**所有單引號加倍**(' → '')。

3. 分頁查詢:LIMIT → ROWNUM 子查詢

MySQL:LIMIT offset, rows
Oracle 兩種高效寫法:

-- 寫法一:雙層子查詢
SELECT * FROM (
  SELECT a.*, ROWNUM rn FROM (
    SELECT * FROM table WHERE cond ORDER BY ord
  ) a WHERE ROWNUM <= 100
) WHERE rn > 80;

-- 寫法二:內聯視圖
SELECT * FROM (
  SELECT ROWNUM rn, c.* FROM (
    SELECT * FROM table WHERE cond ORDER BY ord
  ) c
) WHERE rn > 80 AND rn <= 100;

4. 長字串(>4000 字節) → CLOB + DBMS_LOB

-- 插入 CLOB
DECLARE
  l_clob CLOB;
BEGIN
  DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
  DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(:long_text), :long_text);
  INSERT INTO tbl (clob_col) VALUES (l_clob);
END;

應用層預先做非空/長度校驗。

5. 日期時間處理差異

操作MySQLOracle
當前時間NOW()SYSDATE(精確到秒)
字串轉日期STR_TO_DATE()TO_DATE('2001-08-01','YYYY-MM-DD')
日期轉字串DATE_FORMAT()TO_CHAR(date,'YYYY-MM-DD HH24:MI:SS')
日期運算(7天前)date_col > SUBDATE(NOW(), INTERVAL 7 DAY)date_col > SYSDATE - 7

6. 空字串 vs NULL

MySQL:NOT NULL 欄可存空字串 ''。
Oracle:NOT NULL 欄**不可存空字串**(空字串視同 NULL)。
遷移時:**空字串轉為單空格 ' ' 或保留 NULL**。

7. 模糊查詢優化:LIKE → INSTR

-- MySQL/Oracle 通用但不走索引
WHERE col LIKE '%keyword%'

-- Oracle 專用函數,可配合 Function-Based Index
WHERE INSTR(col, 'keyword') > 0

8. 資源釋放:結果集與游標

Oracle 程序包/函數中操作完資料庫,**必須顯式關閉結果集、游標、連線**,否則洩漏導致 ORA-01000 最大開啟游標超限。

遷移檢查清單

  • ☐ 所有 AUTO_INCREMENT 改為 Sequence + Trigger
  • ☐ 雙引號字串全改單引號並轉義
  • ☐ 分頁 SQL 重寫為 ROWNUM 模式
  • ☐ 長文本欄改 CLOB + DBMS_LOB
  • ☐ 日期函數對照表逐一替換
  • ☐ 空字串處理邏輯調整
  • ☐ 模糊查詢評估 INSTR + FBI 索引
  • ☐ 所有資料庫操作路徑補齊資源關閉代碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved