首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字串欄位精確匹配包含特定字串的兩種方法

     編輯:MySQL 資料庫相關知識

假設欄位 emails 以逗號分隔儲存多個信箱(如 'a@x.com,b@x.com,c@x.com'),需查詢精確包含某信箱的記錄。直接用 LIKE '%b@x.com%' 會誤匹配 bb@x.com。本文介紹兩種正確做法:

方法一:LIKE 配合邊界字元(適用於固定分隔符)

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+)半結構化、需彈性查詢有(虛擬欄位索引)中

最佳實踐建議

  1. 新系統優先設計關聯表(user_emails),避免多值單欄位。
  2. 既有系統若資料量<10萬且查詢頻率低,FIND_IN_SET 即可滿足。
  3. 若必須保留單欄位,可建立虛擬欄位 + 索引(MySQL 5.7+)加速查詢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved