set類型簡介
最近項目中使用了set類型去定義一個常量集合字段,爲了深入瞭解該類型用法去官方文檔學習了一下並進行了一些用法的嘗試。
set是可以具有0到64個值的字符串對象類型(可當集合使用),set列中的值都必須在定義時指定的值列表中選取。set中的每個字符串成員值之間用逗號(,)分隔,所以成員值中不能包含逗號(,)字符串(實質即Mysql把成員值通過逗號拼接成一個完整的字符串)。
注意事項與剖析操作
操作案例表:
create table dictionary
(
id int auto_increment primary key,
collection set('a', 'c', 'f', 'd', 'e', 'b') not null
);
create index dictionary_collection_index on dictionary (collection);
set集合類型有以下細節需要注意:
-
當插入成員值重複(如"a,a")時則set列最後結果只有一個(“a”),如果設置嚴格SQL模式則會報錯
-
成員值中尾隨的空格會被刪除(“a, b”->“a,b”)
-
mysql將set字段根據定義順序分配二進制數字存儲值並維護一個上下文用於檢索與排序,如以上例中定義順序字符串值與數字映射所生成的上下文如下:
成員 十進制值(collection+0) 二進制值 a 1 0001 c 2 0010 f 4 0100 d 8 1000 e 16 10000 b 32 100000 可通過
select collection,collection+0 from dictionary
查看上表中存儲set字段collection存儲字符串對應的十進制數字值,如存儲字符串爲’a,c’,則十進制爲3(1+2),Mysql檢索式會根據數字值3轉換爲對應的字符串再進行返回。用例:- 查找set列中不含’e’、'b’的數據:
select * from dictionary where collection < 16
查找含’a’成員含以下兩種方式:select * from dictionary where collection&1 select * from dictionary where find_in_collection('a',collection)
- 精準查找collection列爲’a,d’的數據:
select * where collection=9
- 查找set列中不含’e’、'b’的數據:
-
插入值時mysql會將值根據set成員的定義順序進行成員值重排序,如:
執行數據插入:insert into dictionary (collection) value ('a,b,c,d'); 再進行數據查詢,會發現該數據值對應的行結果爲:a,c,d,b
-
由於set類型也是一個字符串,所以可以通過
like
檢索,如查找collection列含’c’成員的數據行:select * from dictionary where collection like '%,c,%'
本文主要參考自Mysql官方文檔:https://dev.mysql.com/doc/refman/8.0/en/set.html