萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Oracle 與 MySQL 九大核心差異對比與遷移指南

彙總對比表

#項目OracleMySQL遷移要點
1聚合函數與 GROUP BYSELECT 列必須在 GROUP BY 或聚合函數中允許非 GROUP BY 列 (ONLY_FULL_GROUP_BY 可關閉)遷移前開啟 ONLY_FULL_GROUP_BY 檢查
2自增/序列SEQUENCE + NEXTVALAUTO_INCREMENT / 8.0+ SEQUENCE改寫 INSERT 邏輯或建 SEQUENCE
3字串引號僅單引號,單引號轉義為 ''單/雙引號皆可,\'' 轉義統一單引號,應用層轉義
4分頁語法ROWNUM 子查詢嵌套複雜LIMIT offset, rows / OFFSET FETCH改寫為 LIMIT,效能提升
5長字串 (CLOB/TEXT)>4000 需 DBMS_LOBTEXT/LONGTEXT 直寫簡化應用層邏輯
6日期時間DATE 含時分秒,SYSDATE,TO_DATE/TO_CHAR 格式豐富DATE/TIME/DATETIME/TIMESTAMP,NOW(),DATE_FORMAT型別對應、函數改寫、時區處理
7空值語意NOT NULL 真正禁止 NULLNOT NULL 允許空字串/零值匯入前清洗空字串→NULL
8模糊查詢LIKE '%str%' 不走索引,INSTR() 較快LIKE '%str%' 同,全文索引/ngram 解決全文檢索遷移至 Elasticsearch
9游標/結果集釋放嚴格要求關閉較寬鬆,但連線池洩漏風險應用層統一 try-with-resources

深度解析重點差異

分頁:Oracle 複雜 vs MySQL 簡單

-- Oracle 12c+ 簡化
SELECT * FROM t ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

-- MySQL
SELECT * FROM t ORDER BY id LIMIT 20, 10;
-- 或 8.0+
SELECT * FROM t ORDER BY id LIMIT 10 OFFSET 20;

日期處理:函數映射表

功能OracleMySQL
當前日期時間SYSDATENOW() / CURRENT_TIMESTAMP
日期格式化TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS')DATE_FORMAT(dt, '%Y-%m-%d %H:%i:%s')
字串轉日期TO_DATE('2024-01-01', 'YYYY-MM-DD')STR_TO_DATE('2024-01-01', '%Y-%m-%d')
日期加減SYSDATE - 7 / ADD_MONTHSDATE_SUB(NOW(), INTERVAL 7 DAY) / DATE_ADD
截取日期TRUNC(SYSDATE)DATE(NOW())

空字串與 NULL

-- Oracle: '' 等同 NULL
INSERT INTO t (col) VALUES (''); -- 實際存 NULL

-- MySQL: '' 是空字串,非 NULL
INSERT INTO t (col) VALUES (''); -- 存空字串
-- 遷移時需決定業務語意,統一轉換

遷移工具與策略

  1. SQL Developer Migration Workbench:官方免費,支援 Schema/Code/資料遷移
  2. AWS SCT / Azure DMS:雲遷移評估與轉換
  3. pt-online-schema-change:大表線上結構同步
  4. 驗證步驟:行數核對、檢查和約束、應用端回歸測試、效能基準對比
copyright © 萬盛學電腦網 all rights reserved