首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL CONCAT 函數實戰:字符串拼接的「隱形殺手」——NULL 值陷阱

     編輯:MySQL 綜合教學

一個簡單卻致命的現象

開發中常需拼接字段,如「姓名:性別」。MySQL 提供 CONCAT(str1, str2, ...),用法直觀:

SELECT CONCAT(name, ':', sex) FROM pet1;

但執行結果卻讓人大跌眼鏡:

+----------------------+
| concat(name,':',sex) |
+----------------------+
| 1:c                  |
| NULL                 |  <-- 這行數據原本只有 sex 為 NULL
| a:n                  |
| abc:n                |
+----------------------+

核心規則:任一參數為 NULL,結果即為 NULL

這是 SQL 標準行為,**非 Bug**。CONCAT 遇到 NULL 直接短路返回 NULL,不會拼接成空字符串。

三種避坑方案

1. COALESCE / IFNULL 預處理(推薦)

將可能為 NULL 的字段轉為空串:

SELECT CONCAT(COALESCE(name, ''), ':', COALESCE(sex, '')) FROM pet1;
-- 或
SELECT CONCAT(IFNULL(name, ''), ':', IFNULL(sex, '')) FROM pet1;

2. 使用 CONCAT_WS(帶分隔符拼接)

CONCAT_WS(separator, str1, str2, ...) 會**自動跳過 NULL 值**,且不會產生多餘分隔符:

SELECT CONCAT_WS(':', name, sex) FROM pet1;
-- 結果:'1:c', 'a:n', 'abc:n'  (NULL 行變為空字符串 '')

**注意**:若所有參數均為 NULL,返回空串而非 NULL。

3. 業務層面約束 NOT NULL

建表時給字符串字段加 NOT NULL DEFAULT '',從源頭杜絕 NULL,但需評估業務語義(「未知」vs「空」)。

擴展:CONCAT 進階用法

  • 數字隱式轉換:CONCAT(14.3) → '14.3'
  • 生成動態 SQL:SELECT CONCAT('UPDATE t SET c=', val, ' WHERE id=', id) FROM ...
  • 配合 GROUP_CONCAT:行轉列聚合。

總結

CONCAT 看似簡單,**NULL 短路特性**是生產環境常見 Bug 根源。養成習慣:拼接前必做 NULL 防禦,優先選 CONCAT_WS 或 COALESCE,讓 SQL 更健壯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved