在資料庫開發中,字串串接是常見操作。MySQL 和 Oracle 雖然都提供 CONCAT() 函數,但參數支援、NULL 處理、資料型別轉換等行為有顯著差異。本文詳細比較這兩大資料庫的 CONCAT() 特性,幫助開發者避開跨平台遷移的陷阱。
MySQL:支援多字串一次串接,語法為 CONCAT(str1, str2, ...),可接受任意數量參數。
Oracle:僅支援兩個參數,語法為 CONCAT(str1, str2)。若需串接多組字串,必須採用巢狀寫法 CONCAT(CONCAT(str1, str2), str3),或改用 || 運算子(如 str1 || str2 || str3),後者更直觀且效能相當。
這是最容易導致邏輯錯誤的地方:
CONCAT('A', NULL, 'C') 結果為 NULL。'AC'。實務建議:跨庫 SQL 寫法請善用 COALESCE() 或 IFNULL()/NVL() 先行處理 NULL 值,確保行為一致。
MySQL:
Oracle:若 CONCAT 參數非字串型別,會嘗試隱性轉換為字串(等同 TO_CHAR()),彈性較高但需注意隱性轉換效能影響。
Oracle 開發者習慣使用 || 進行字串串接,優點包括:
CONCAT() 相同(視為空字串)。SELECT、WHERE、ORDER BY 等子句。| 特性 | MySQL CONCAT() | Oracle CONCAT() | Oracle || |
|---|---|---|---|
| 參數數量 | 不限 | 固定 2 個 | 不限 |
| NULL 處理 | 回傳 NULL | 視為空字串 | 視為空字串 |
| 非字串轉換 | 隱性轉換 | 隱性轉換 | 隱性轉換 |
| 二進位字串 | 自動判定 | N/A | N/A |
掌握上述差異,即可在異構資料庫環境下撰寫相容性更高、維護性更佳的 SQL 程式碼。