在 Java、C# 等主流程式語言中,字串拼接習慣使用 + 號(如 "1" + "3"、"a" + "b")。然而在 MySQL 中,直接使用 + 連接字串往往會得到「驚人」的結果。本文將深入剖析 MySQL 字串連接的獨特行為,並詳細講解標準函數 CONCAT 與 CONCAT_WS 的正確用法,助你避開常見坑點。
執行以下 SQL:
SELECT '12' + '33', FAge + '1' FROM T_Employee;
第一列結果並非預期的 '1233',而是 45。原因在於:MySQL 遇到 + 運算子時,會嘗試將兩側運算元**轉換為數值型別**;轉換失敗則視為 0。因此 '12' 變為 12,'33' 變為 33,最終執行數學加法 12 + 33 = 45。同理,若欄位 FAge 為數值型別,FAge + '1' 會將 '1' 轉為 1 進行加法運算。
SELECT 'abc' + '123', FAge + 'a' FROM T_Employee;
'abc' 無法轉為數值,視為 0;'123' 轉為 123,結果為 123。'a' 同樣視為 0,故 FAge + 'a' 等同於 FAge + 0。
核心結論:MySQL 中
+僅為**算術加法運算子**,不具備字串拼接功能。
CONCAT(str1, str2, ...)
NULL 則整體回傳 NULLSELECT CONCAT('工號為:', FNumber, '的員工幸福指數:', FSalary / (FAge - 21))
FROM T_Employee;
輸出範例:工號為:E001的員工幸福指數:2.5
CONCAT(123) 回傳 '123',可作為「將任意值轉為字串」的快捷方式。
CONCAT_WS(separator, str1, str2, ...)
NULL 值(不會產生連續分隔符)SELECT CONCAT_WS(',', FNumber, FAge, FDepartment, FSalary)
FROM T_Employee;
輸出:E001,28,RD,25000
在 Microsoft SQL Server 中,+ 可直接用於字串拼接:
SELECT '工號為' + FNumber + '的員工姓名為' + FName
FROM T_Employee
WHERE FName IS NOT NULL;
這也是許多開發者從 SQL Server 遷移至 MySQL 時容易踩坑的關鍵差異。
| 場景 | 推薦函數 | 注意事項 |
|---|---|---|
| 一般字串拼接 | CONCAT | 參數含 NULL 會導致整體為 NULL,可用 IFNULL(col, '') 預處理 |
| 需固定分隔符(如 CSV、日誌) | CONCAT_WS | 自動忽略 NULL,避免 ,, 空欄位 |
| 數值運算 | + | 確保雙方均為數值型別,或顯式 CAST |
掌握 CONCAT 與 CONCAT_WS,即可在 MySQL 中優雅、高效地處理一切字串拼接需求,徹底告別 + 號帶來的隱式轉換驚喜。