本文整理 MySQL 5.6/5.7 與 Oracle 11g/12c 常用函數的對應關係,涵蓋數值、字串、日期、轉換、流程控制等類別,助力異構資料庫遷移與跨平台 SQL 撰寫。
| 功能 | Oracle | MySQL | 備註 |
|---|---|---|---|
| 四捨五入 | ROUND(n, m) | ROUND(n, m) | 語法相同 |
| 絕對值 | ABS(n) | ABS(n) | 語法相同 |
| 向上取整 | CEIL(n) | CEILING(n) | 函數名不同 |
| 向下取整 | FLOOR(n) | FLOOR(n) | 語法相同 |
| 最大/最小值 | MAX(expr)/MIN(expr) | MAX(expr)/MIN(expr) | 聚合函數相同 |
| 截斷數值 | TRUNC(n, m) | TRUNCATE(n, m) 或 CAST(n AS SIGNED) | MySQL 無 TRUNC,用 TRUNCATE 或 CAST |
| 功能 | Oracle | MySQL | 備註 |
|---|---|---|---|
| 字符 ASCII 碼 | ASCII(str) | ASCII(str) | 相同 |
| 碼值轉字符 | CHR(n) | CHAR(n) | 函數名不同 |
| 字串替換 | REPLACE(str, from, to) | REPLACE(str, from, to) | 相同 |
| 子串位置 | INSTR(str, substr, pos, occ) | INSTR(str, substr) / LOCATE(substr, str) | Oracle 支援起始位置/出現次數;MySQL LOCATE 參數順序相反 |
| 子串截取 | SUBSTR(str, pos, len) | SUBSTRING(str, pos, len) / SUBSTR(str, pos, len) | MySQL 兩者皆可 |
| 字串長度 (字符數) | LENGTH(str) *按字節* | CHAR_LENGTH(str) / CHARACTER_LENGTH(str) | Oracle LENGTH 視字符集而定;MySQL 用 CHAR_LENGTH 計字符數 |
| 左填充 | LPAD(str, len, pad) | LPAD(str, len, pad) | 相同 |
| 大小寫轉換 | UPPER/LOWER | UPPER/LOWER | 相同 |
| 去除空格 | TRIM / LTRIM / RTRIM | TRIM / LTRIM / RTRIM | 相同 |
| 字串連接 | CONCAT(s1, s2) 或 s1 \|\| s2 | CONCAT(s1, s2, ...) | MySQL 不支援 \|\| (視為 OR),需用 CONCAT |
| 功能 | Oracle | MySQL | 備註 |
|---|---|---|---|
| 當前日期時間 | SYSDATE | NOW() / SYSDATE() | MySQL NOW() 為語句執行時刻,SYSDATE() 為函數執行時刻 |
| 日期格式化 | TO_CHAR(dt, 'fmt') | DATE_FORMAT(dt, 'fmt') | 格式字元不同:YYYY→%Y, MM→%m, DD→%d, HH24→%H, MI→%i, SS→%s |
| 字串轉日期 | TO_DATE(str, 'fmt') | STR_TO_DATE(str, 'fmt') | 格式字元同上 |
| 日期加減月 | ADD_MONTHS(dt, n) | DATE_ADD(dt, INTERVAL n MONTH) | MySQL INTERVAL 語法靈活支援 YEAR/DAY/HOUR 等 |
| 下一個指定星期 | NEXT_DAY(dt, weekday) | 無內建,需自定義函數 | MySQL 需自行實現 |
| 兩日期差天數 | dt1 - dt2 (結果含小數) | DATEDIFF(dt1, dt2) (整數天數) | Oracle 直接相減;MySQL 用 DATEDIFF |
| 日期截斷 | TRUNC(dt, 'fmt') | DATE(dt) / DATE_FORMAT... | MySQL 無直接對應 |
| 功能 | Oracle | MySQL | 備註 |
|---|---|---|---|
| 空值替換 (顯示) | NVL(expr1, expr2) | IFNULL(expr1, expr2) / COALESCE(expr1, expr2) | COALESCE 為標準 SQL,支援多參數,推薦使用 |
| 空值判斷 (布林) | 無直接函數 | ISNULL(expr) → 1/0 | MySQL 特有 |
| 多條件分支 | DECODE(expr, v1, r1, v2, r2, ..., def) | CASE WHEN ... THEN ... ELSE ... END / IF(cond, t, f) | DECODE 為 Oracle 專有;MySQL 用標準 CASE 或 IF() |
| 條件判斷 | CASE WHEN ... | CASE WHEN ... / IF(cond, t, f) | IF() 為 MySQL 擴展,返回數值或字串 |
| 功能 | Oracle | MySQL | 備註 |
|---|---|---|---|
| 轉字串 | TO_CHAR(n/dt, 'fmt') | CAST(expr AS CHAR) / CONCAT(expr, '') | MySQL 隱式轉換較強,常無需顯式轉換 |
| 轉數值 | TO_NUMBER(str) | CAST(str AS SIGNED) / CAST(str AS DECIMAL) | SIGNED 為帶符號整數 |
| 轉日期 | TO_DATE(str, 'fmt') | STR_TO_DATE(str, 'fmt') | 同上 |
| 字符集轉換 | CONVERT(str, dest_charset, src_charset) | CONVERT(str USING charset) | 語法不同 |
| 功能 | Oracle | MySQL |
|---|---|---|
| 取得下一值 | SEQ_NAME.NEXTVAL | AUTO_INCREMENT 欄位,插入後 LAST_INSERT_ID() 取得 |
| 當前值 | SEQ_NAME.CURRVAL | LAST_INSERT_ID() (會話級) |
| 功能 | Oracle | MySQL |
|---|---|---|
| SUM / AVG / COUNT | 相同 | 相同 |
| 標準差 / 變異數 | STDDEV / VARIANCE | STDDEV / VARIANCE (MySQL 5.7+) |
| 功能 | Oracle | MySQL |
|---|---|---|
| 錯誤代碼 | SQLCODE | 無對應,Java 中用 SQLException.getErrorCode() |
| 錯誤訊息 | SQLERRM | 無對應,Java 中用 SQLException.getMessage() |
| 控制台輸出 | DBMS_OUTPUT.PUT_LINE | 無對應,存儲過程中用 SELECT 'msg'; 或應用層日誌 |
\|\| 改為 CONCAT() 或應用層拼接。