開發中常需拼接字段,如「姓名:性別」。MySQL 提供 CONCAT(str1, str2, ...),用法直觀:
SELECT CONCAT(name, ':', sex) FROM pet1;
但執行結果卻讓人大跌眼鏡:
+----------------------+
| concat(name,':',sex) |
+----------------------+
| 1:c |
| NULL | <-- 這行數據原本只有 sex 為 NULL
| a:n |
| abc:n |
+----------------------+
這是 SQL 標準行為,**非 Bug**。CONCAT 遇到 NULL 直接短路返回 NULL,不會拼接成空字符串。
將可能為 NULL 的字段轉為空串:
SELECT CONCAT(COALESCE(name, ''), ':', COALESCE(sex, '')) FROM pet1;
-- 或
SELECT CONCAT(IFNULL(name, ''), ':', IFNULL(sex, '')) FROM pet1;
CONCAT_WS(separator, str1, str2, ...) 會**自動跳過 NULL 值**,且不會產生多餘分隔符:
SELECT CONCAT_WS(':', name, sex) FROM pet1;
-- 結果:'1:c', 'a:n', 'abc:n' (NULL 行變為空字符串 '')
**注意**:若所有參數均為 NULL,返回空串而非 NULL。
建表時給字符串字段加 NOT NULL DEFAULT '',從源頭杜絕 NULL,但需評估業務語義(「未知」vs「空」)。
CONCAT(14.3) → '14.3'SELECT CONCAT('UPDATE t SET c=', val, ' WHERE id=', id) FROM ...CONCAT 看似簡單,**NULL 短路特性**是生產環境常見 Bug 根源。養成習慣:拼接前必做 NULL 防禦,優先選 CONCAT_WS 或 COALESCE,讓 SQL 更健壯。