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

Oracle 遷移 MySQL 完整避坑指南:語法、型別、分頁與相容性設計

     編輯:Oracle 資料庫基礎

遷移背景與原則

專案需將 Oracle 環境移植至 MySQL(Linux),**核心原則:不改應用代碼,僅調整 DDL/初始化腳本**。實戰中遇到的 5 大類差異及解法如下。

差異 1:識別符大小寫敏感度

場景OracleMySQL (Linux)
未加引號不區分大小寫,內部轉大寫**區分大小寫**(表名對應目錄,列名對應檔案)
加雙引號區分大小寫,保持原樣區分大小寫,保持原樣

解法:

  1. 統一規範:**所有表名、列名採用小寫 + 下劃線**(如 order_items),DDL、SQL、代碼全域一致。
  2. 若既有代碼大小寫混用,必須在 MySQL 端建立**同名視圖**或**修改代碼**。
  3. mysqldump 導出時加 --lower-case-table-names=1(需實例級配置)。

差異 2:保留字衝突

Oracle 允許保留字作識別符(如 INTERVAL, SHOW),MySQL 直接報語法錯誤。

解法:

  • **反引號包裹**:INSERT INTO t (id, \`interval\`) VALUES (...)
  • **前綴表名**:INSERT INTO t (id, t.interval) VALUES (...)
  • **根治**:設計階段**禁用保留字**,或統一加前綴 _(如 _interval)。

差異 3:資料型別對照表

OracleMySQL備註
VARCHAR2(n)VARCHAR(n)MySQL 5.0+ VARCHAR 支援 65535 位元組
NUMBER(p,s)DECIMAL(p,s) / NUMERIC(p,s)MySQL 無精度無標度的 NUMBER 等價型別
DATEDATETIMEOracle DATE 含時間,MySQL DATE 僅日期
TIMESTAMPTIMESTAMPMySQL TIMESTAMP 範圍 1970-2038,跨世紀用 DATETIME
CLOB/BLOBLONGTEXT/LONGBLOBMySQL TEXT 族群分級更細
RAWVARBINARY / BINARY

差異 4:自動遞增機制

OracleMySQL
SEQUENCE + Trigger / 代碼手動 .NEXTVALAUTO_INCREMENT 欄位屬性

遷移策略:

  1. 將 PK 欄位改為 BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY。
  2. 既有 Sequence 值:建立對應表 seq_migrate(seq_name, last_val),應用啟動時同步 AUTO_INCREMENT = last_val + 1。
  3. 若業務強依賴 Sequence 非連續特性(如訂單號含業務編碼),維護獨立序號表 + 存儲過程模擬。

差異 5:索引長度限制

  • MySQL 4.1.2+ (InnoDB/MyISAM):**單索引鍵長 ≤ 1000 位元組**。
  • UTF8MB4:1 字符 = 4 位元組 → 最大 255 字符。
  • Oracle 限制寬鬆得多(~3900 位元組)。

解法:

  • 縮短索引欄位長度(如 VARCHAR(255) → VARCHAR(191))。
  • 使用**前綴索引**:INDEX idx_name (col(50))。
  • 改用 Hash 索引或全文索引(視查詢模式)。

跨資料庫相容性設計原則(新專案必讀)

  1. 堅持 ANSI SQL 標準:不寫 Oracle 專有語法(DECODE→CASE, (+)→LEFT JOIN, SYSDATE→CURRENT_TIMESTAMP)。
  2. 分頁查詢抽象化:DAO 層封裝 Pageable 介面,Oracle 用 ROWNUM/OFFSET FETCH,MySQL 用 LIMIT OFFSET,PostgreSQL 用 LIMIT OFFSET。
  3. 識別符統一風格:全小寫 + 下劃線,DDL、代碼、ORM 映射三方一致。
  4. 保留字零容忍:命名規範檢查工具(如 Flyway/Liquibase 檢查腳本)攔截保留字。
  5. 型別映射表標準化:維護專案級 type_mapping.yml,遷移腳本自動轉換。

驗收清單

項目驗收標準
DDL 執行MySQL 5.7/8.0 無報錯建立所有物件
資料導入全量資料對帳一致(行數、關鍵欄位 checksum)
應用測試核心業務流程 100% 通過,無 SQL 異常
效能基線關鍵 SQL 執行計畫合理,慢查詢 < 1s
相容性回歸同一代碼包在 Oracle/MySQL 雙環境跑通測試套件

結語

Oracle → MySQL 遷移,**80% 的坑在設計階段就能填平**。「不改代碼」是美好願景,現實往往需要微調 DAO 層分頁、日期處理、保留字轉義。建立**型別映射表、命名規範、分頁抽象層**三件套,才能實現真正的「寫一次,跑兩邊」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved