業務邏輯不變,**盡量只改 DDL/初始化腳本,不動應用程式碼**。若初期設計遵循標準 SQL,遷移成本幾乎為零。
Oracle:預設不區分大小寫,識別符自動轉大寫。
MySQL (Linux):資料庫/表名對應檔案系統,**嚴格區分大小寫**。
對策:統一採用**小寫**命名資料庫、表、欄位;應用程式 SQL 字串中識別符與 DDL 完全一致;若 Oracle 腳本已產生大寫,批次轉小寫。
Oracle 允許保留字作識別符(如 INTERVAL, SHOW)。
MySQL 直接報語法錯誤。
對策:識別符雙重保護——反引號 \`col\` 或 表名限定 tbl.col:
INSERT INTO t (id, `interval`) VALUES (...);
-- 或
INSERT INTO t (id, t.interval) VALUES (...);
命名規範建議:識別符前綴 _(如 _interval),永遠避開保留字。
| Oracle | MySQL 對應 | 備註 |
|---|---|---|
VARCHAR2 | VARCHAR | 語義相同 |
NUMBER | NUMERIC / DECIMAL | 精度/標度語法一致 |
DATE | DATETIME | Oracle DATE 含時間 |
| — | TIME | MySQL 獨有純時間型別 |
Oracle:SEQUENCE + TRIGGER 或應用層 .NEXTVAL。
MySQL:AUTO_INCREMENT 欄位屬性,插入時給 NULL/0 自動生成。
對策:DDL 改為 id INT AUTO_INCREMENT PRIMARY KEY,移除 Sequence 物件與觸發器。極少數需跨表唯一 ID 時,建立專用序列表模擬。
MySQL 4.1.2+:單索引鍵長 ≤ 1000 bytes(UTF-8 約 333 字元)。Oracle 限制寬鬆得多。
對策:長字串欄位建立**前綴索引** INDEX idx_name (col(200)),或改用哈希/全文索引。
LIMIT offset, rows (MySQL/PG) vs ROWNUM (Oracle) → 應用層封裝 PageQuery 介面。_ 避開保留字。'YYYY-MM-DD HH:MM:SS' 格式。utf8mb4,連線參數 characterEncoding=utf8。