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

MySQL FIND_IN_SET 函數實戰:逗號分隔字串的集合查詢

     編輯:MySQL 綜合教學

場景:單欄位儲存多值(權限 ID 列表),需查詢「包含某值」的記錄

表 user 欄位 purview VARCHAR(255) 儲存 '1,2,3,4,5',查詢擁有權限 1 的用戶。

標準語法

SELECT * FROM `user` WHERE FIND_IN_SET('1', `purview`);

函數行為詳解

  • FIND_IN_SET(str, strlist):在逗號分隔字串 strlist 中搜尋 str,找到返回位置(1-based),否則返回 0
  • 精確匹配:'1' 不會匹配 '11' 或 '1,2' 中的 '11',因為以逗號為邊界
  • NULL 處理:任一參數為 NULL 返回 NULL
  • 大小寫:依欄位排序規則,utf8_general_ci 不敏感

效能警示:無法使用索引

EXPLAIN SELECT * FROM user WHERE FIND_IN_SET('1', purview);
-- type: ALL(全表掃描)

資料量 > 10 萬時查詢明顯變慢。大規模場景建議:

適用場景

  • 資料量小(< 5 萬)、查詢頻率低、結構簡單的內部工具
  • 快速原型、臨時分析、遷移過渡期
  • 單值精確匹配,無範圍/排序需求

設計權衡提醒

「這樣設計資料表的目的是減少表的數量,但是會增加更新的難度!」

  • 新增/移除權限需 UPDATE ... SET purview = CONCAT/REPLACE ...,易產生併發衝突、字串長度溢出
  • 無法加外鍵約束、無法統計權限分佈
  • 長期專案強烈建議規範化,短期收益不抵長期技術債

FIND_IN_SET 是 MySQL 特有的便利函數,善用於輕量場景,切勿濫用於核心業務大表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點
規範化:關聯表 user_purview (user_id, purview_id)索引支援、ACID、標準關聯查詢寫入稍複雜、需 JOIN
JSON 欄位 (MySQL 5.7+)JSON_CONTAINS 可用虛擬欄位索引版本要求、學習成本
全文索引 + MATCH AGAINST支援多值搜尋分詞邏輯、精確匹配難控制
應用層快取權限位圖極快、無資料庫壓力一致性維護複雜