假設欄位 emails 以逗號分隔儲存多個信箱(如 'a@x.com,b@x.com,c@x.com'),需查詢精確包含某信箱的記錄。直接用 LIKE '%b@x.com%' 會誤匹配 bb@x.com。本文介紹兩種正確做法:
SELECT * FROM users
WHERE CONCAT(',', emails, ',') LIKE '%,b@x.com,%';
在前後加上分隔符再比對,確保完整匹配。效能一般,無法使用索引。
FIND_IN_SET() 函數(推薦)SELECT * FROM users WHERE FIND_IN_SET('b@x.com', emails) > 0;
FIND_IN_SET(str, strlist) 回傳 str 在以逗號分隔的 strlist 中的位置(從 1 開始),找不到回傳 0。| 方案 | 適用場景 | 索引支援 | 維護成本 |
|---|---|---|---|
FIND_IN_SET | 中小資料量、逗號分隔固定格式 | 無 | 低 |
LIKE+邊界 | 分隔符非逗號或需模糊匹配 | 無 | 低 |
| 關聯表(正規化) | 大量資料、高頻查詢、需索引 | 有 | 中 |
| JSON 欄位 (MySQL 5.7+) | 半結構化、需彈性查詢 | 有(虛擬欄位索引) | 中 |
user_emails),避免多值單欄位。FIND_IN_SET 即可滿足。