萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL CONCAT() 字串串接函數進階應用:動態搜尋條件構建與 NULL 安全處理

語法與特性回顧


CONCAT(str1, str2, ...)
-- 任一參數為 NULL → 結果 NULL
-- 全非二進位 → 非二進位結果
-- 含二進位 → 二進位結果

實戰:DedeCMS 多欄位聯合模糊搜尋


-- 原始:單欄搜尋
$kwsqls[] = " arc.title LIKE '%$k%' ";

-- 優化:CONCAT 多欄位一次搜尋
$kwsqls[] = " CONCAT(arc.title, ' ', arc.writer, ' ', arc.keywords) LIKE '%$k%' ";

優點:單一 LIKE 掃描,減少 OR 條件。
缺點:**無法使用索引** (函數導致),適合中小表或全文搜尋替代方案。

NULL 安全串接:CONCAT_WS


-- CONCAT_WS(separator, str1, str2, ...)
-- 自動跳過 NULL,不跳過空字串
SELECT CONCAT_WS(',', 'a', NULL, 'c', '');  -- 'a,c,'
SELECT CONCAT('a', ',', NULL, ',', 'c');    -- NULL

進階:動態構建 WHERE 條件


-- 應用層組裝 (防注入用參數化)
$conditions = [];
$params = [];
if ($title) { $conditions[] = "title LIKE ?"; $params[] = "%$title%"; }
if ($author) { $conditions[] = "author LIKE ?"; $params[] = "%$author%"; }
$where = $conditions ? "WHERE " . implode(" AND ", $conditions) : "";
$sql = "SELECT * FROM article $where LIMIT 20";

效能提醒

  • CONCAT 在 WHERE/JOIN ON 中使用 → **索引失效**
  • 需搜尋多欄位:考慮 FULLTEXT INDEX 或 Elasticsearch
  • 單純顯示用途 (SELECT 清單) 無效能影響

相關函數速查

函數用途NULL 處理
CONCAT簡單串接全 NULL
CONCAT_WS分隔符串接跳過 NULL
GROUP_CONCAT群組聚合跳過 NULL
INSERT(str, pos, len, newstr)替換指定位置NULL → NULL
copyright © 萬盛學電腦網 all rights reserved