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

MySQL SET類型欄位操作全解析:位運算實現標籤增刪查

     編輯:MySQL 資料庫相關知識

SET類型是MySQL獨有的集合類型,底層以位圖存儲,單欄位最多64成員,極適合「標籤、屬性、權限位」等多值單選場景。本文深度解析位運算增刪查核心技巧。

存儲原理

`mark` SET('index','best','hot')
-- 成員對應位值:
-- index → 第0位 → 2^0 = 1
-- best  → 第1位 → 2^1 = 2
-- hot   → 第2位 → 2^2 = 4
-- 組合 'index,best' → 1|2 = 3
-- 組合 'index,hot'  → 1|4 = 5

MySQL自動處理字符串↔數字轉換,SET mark=1與SET mark='index'等效。

核心操作:位運算三板斧

操作SQL模板位運算原理範例
新增標籤UPDATE t SET mark = mark | 值按位或 |:置1保留原有mark = mark | 1 | 2 加 index+best
刪除標籤UPDATE t SET mark = mark & ~值按位與取反 & ~:目標位清0,其它保留mark = mark & ~4 & ~1 刪 hot+index
查詢包含SELECT * FROM t WHERE FIND_IN_SET('標籤', mark)內建函數,自動解析集合WHERE FIND_IN_SET('hot', mark)
查詢包含(位運算)SELECT * FROM t WHERE mark & 值按位與 &:結果非0即包含WHERE mark & 1 含 index

實戰範例

文章標籤管理

-- 表結構
CREATE TABLE article (
  id INT PRIMARY KEY,
  title VARCHAR(100),
  tags SET('tech','life','travel','food','sport')  -- 5標籤,值1,2,4,8,16
);

-- 發文帶標籤
INSERT INTO article (id, title, tags) VALUES (1, 'MySQL SET深度解析', 'tech,life');

-- 後台添加 'travel' 標籤(不影響原有)
UPDATE article SET tags = tags | 4 WHERE id = 1;  -- 4 = travel

-- 移除 'life' 標籤
UPDATE article SET tags = tags & ~2 WHERE id = 1; -- 2 = life

-- 查詢含 'tech' 的文章
SELECT * FROM article WHERE FIND_IN_SET('tech', tags);
-- 或
SELECT * FROM article WHERE tags & 1;

進階技巧

  • 批量統計標籤分佈:
    SELECT 
      SUM(tags & 1) AS tech_cnt,
      SUM(tags & 2) AS life_cnt,
      SUM(tags & 4) AS travel_cnt
    FROM article;
    
  • 多標籤AND查詢(同時含tech和travel):WHERE (tags & 1) AND (tags & 4)
  • 多標籤OR查詢:WHERE tags & (1|4) 或 WHERE FIND_IN_SET('tech',tags) OR FIND_IN_SET('travel',tags)
  • 獲取所有標籤字符串:SELECT CAST(tags AS CHAR) FROM article WHERE id=1 → 'tech,travel'

避坑指南

坑點說明規避
成員超過64個SET最大64成員改用JSON或關聯表
成員名含逗號/空格解析錯誤成員名用下劃線,不含特殊字符
NOT NULL預設值預設為空字符串''顯式DEFAULT ''
索引效能SET欄位索引效果一般高頻查詢建冗余標籤表或JSON索引

SET類型配合位運算,以「極小空間、極快運算」實現多值屬性管理,是標籤系統的輕量級首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved