SET类型用于存储预定义字符串集合中的多个值,通过位图机制以二进制形式存储,每个值对应一个位,最多支持64个成员,适用于固定多选场景如权限或标签,但不支持动态修改且迁移兼容性差,建议频繁变动的场景使用关联表替代。
MySQL中的SET类型是一种特殊的字符串对象,用来存储一组预定义的字符串值中的零个或多个。它和ENUM类似,但允许选择多个值,而不是只能选一个。
在创建表时,可以这样定义一个SET类型的字段:
CREATE TABLE example (tags SE
T('red', 'green', 'blue'));
这表示tags字段可以从'red'、'green'、'blue'中选择多个值,也可以不选(空值)或者选多个,比如同时选'red'和'blue'。
SET字段的值必须是定义时列出的选项的组合。支持以下几种写法:
INSERT INTO example VALUES ('red');
INSERT INTO example VALUES ('red,blue');
INSERT INTO example VALUES ('');(表示没有选任何项)注意:插入的值顺序不影响存储,MySQL会按定义的顺序自动排序显示。
MySQL使用位图(bit map)来存储SET值。每个允许的值对应一个二进制位:
例如,'red,blue' 对应 1 + 4 = 5,MySQL底层以整数5存储。最大支持64个成员,因此最多可以有64个可选项。
虽然SET方便,但也有一些限制和潜在问题:
基本上就这些。SET适合固定且有限的多选场景,比如权限标记、颜色选项等。如果需要更灵活的设计,建议用独立的关联表代替。