CONCAT(str1, str2, ...)
-- 任一參數為 NULL → 結果 NULL
-- 全非二進位 → 非二進位結果
-- 含二進位 → 二進位結果
-- 原始:單欄搜尋
$kwsqls[] = " arc.title LIKE '%$k%' ";
-- 優化:CONCAT 多欄位一次搜尋
$kwsqls[] = " CONCAT(arc.title, ' ', arc.writer, ' ', arc.keywords) LIKE '%$k%' ";
優點:單一 LIKE 掃描,減少 OR 條件。
缺點:**無法使用索引** (函數導致),適合中小表或全文搜尋替代方案。
-- CONCAT_WS(separator, str1, str2, ...)
-- 自動跳過 NULL,不跳過空字串
SELECT CONCAT_WS(',', 'a', NULL, 'c', ''); -- 'a,c,'
SELECT CONCAT('a', ',', NULL, ',', 'c'); -- NULL
-- 應用層組裝 (防注入用參數化)
$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| 函數 | 用途 | NULL 處理 |
|---|---|---|
| CONCAT | 簡單串接 | 全 NULL |
| CONCAT_WS | 分隔符串接 | 跳過 NULL |
| GROUP_CONCAT | 群組聚合 | 跳過 NULL |
| INSERT(str, pos, len, newstr) | 替換指定位置 | NULL → NULL |