| 項目 | MySQL | Oracle | 處理方式 |
|---|---|---|---|
| 自增主鍵 | AUTO_INCREMENT | SEQUENCE + TRIGGER | 建立 SEQUENCE,INSERT 時用 seq.NEXTVAL,或 12c+ GENERATED AS IDENTITY |
| 字串引號 | 單引號/雙引號皆可 | 僅單引號 | 所有雙引號改單引號;單引號轉義:'' |
| 分頁查詢 | LIMIT offset, rows | ROWNUM 子查詢 | 標準寫法:SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT * FROM t ORDER BY id) a WHERE ROWNUM <= :end) WHERE rn > :start |
| 長文本 | TEXT/BLOB | CLOB/BLOB | 超過 4000 字元必須用 CLOB,配合 DBMS_LOB 套件讀寫 |
| 日期類型 | DATE / TIME 分離 | DATE 含時分秒 | 用 SYSDATE 取當前,TO_DATE/TO_CHAR 格式化,日期運算 SYSDATE - 7 代表 7 天前 |
| 空值約束 | NOT NULL 允許空字串 | NOT NULL 禁止 NULL | 匯入前將空字串轉為單空格 ' ' 或預設值 |
| 模糊查詢 | LIKE '%str%' | LIKE '%str%' 不走索引 | 改用 INSTR(col, 'str') > 0 可利用索引(需建立 Function-based Index) |
| 資源釋放 | 自動/較寬鬆 | 嚴格 | 程式中顯式關閉 ResultSet、Statement、Connection |
CREATE SEQUENCE seq_t_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCYCLE NOCACHE;
INSERT INTO t(id, name) VALUES (seq_t_id.NEXTVAL, 'abc');
-- 方式一:雙層 ROWNUM
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM table_name WHERE cond1 ORDER BY cond2
) a WHERE ROWNUM <= 100
) WHERE rn > 80;
-- 方式二:內聯視圖
SELECT * FROM (
SELECT ROWNUM rn, c.* FROM (
SELECT * FROM table_name WHERE cond1 ORDER BY cond2
) c
) WHERE rn > 80 AND rn <= 100;
-- MySQL: WHERE dt > SUBDATE(NOW(), INTERVAL 7 DAY)
-- Oracle: WHERE dt > SYSDATE - 7
MySQL → Oracle 遷移不僅是語法轉換,更涉及架構差異(序列 vs 自增、CLOB 處理、分頁模式)。建議建立遷移腳本自動化轉換,並針對核心業務進行完整回歸測試。