MySQL 的 SET 类型是一种字符串对象,可以有零个或多个值,其值来自表创建时规定的允许的一列值。
指定包含多个 SET 成员的 SET 列值时,各成员之间用逗号(,)间隔开,且成员值本身不能包含逗号。
SET 类型的优势在于:它只能在固定值中选择,可以在数据库层面限制非法值;
数据存储时用数字表示,占用空间少。
创建 SET 类型的列时,需要定义可能的值集合。例如:
CREATE TABLE your_table (
your_column SET('value1', 'value2', 'value3',...)
);
需要注意的是,SET 类型有以下特点:
插入重复的 SET 类型成员时,MySQL 会自动删除重复的成员。
向 SET 类型的字段插入不存在于预定义集合中的值时,MySQL 会抛出错误。
SET 类型可以一次选择多个成员,而 ENUM 类型一次只能取一个值。
例如,创建一个包含爱好(hobby)字段的表,hobby 字段为 SET 类型,可以包含'music'、'movie'、'swimming'等爱好:
CREATE TABLE set_table (
id INT AUTO_INCREMENT PRIMARY KEY,
hobby SET('music','movie','swimming')
);
然后可以插入包含不同爱好组合的数据:
INSERT INTO set_table (hobby) VALUES
('music'),
('movie'),
('music,movie'),
('swimming'),
('music,swimming'),
('movie,swimming'),
('music,movie,swimming');
查询数据时,可以使用 FIND_IN_SET 函数或 LIKE 操作符等进行搜索。例如,找出爱好中包含'swimming'的记录:
SELECT * FROM set_table WHERE FIND_IN_SET('swimming', hobby) > 0;
或者找出爱好包含'mov'的记录(甚至是在另一个 SET 成员的子字符串中):
SELECT * FROM set_table WHERE hobby LIKE '%mov%';