SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64。设置字段值时,可以取取值范围内的 0 个或多个值。

    当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的,具体如下:

    成员个数范围(L表示实际成员个数) 占用的存储空间
    1 <= L <= 8 1个字节
    9 <= L <= 16 2个字节
    17 <= L <= 24 3个字节
    25 <= L <= 32 4个字节
    33 <= L <= 64 8个字节

    SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。

    举例:

    创建表:

    1. CREATE TABLE test_set(
    2. s SET ('A', 'B', 'C')
    3. );

    向表中插入数据:

    1. INSERT INTO test_set (s) VALUES ('A'), ('A,B');
    2. #插入重复的SET类型成员时,MySQL会自动删除重复的成员
    3. INSERT INTO test_set (s) VALUES ('A,B,C,A');
    4. #向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
    5. INSERT INTO test_set (s) VALUES ('A,B,C,D');
    6. SELECT *
    7. FROM test_set;

    举例:

    1. CREATE TABLE temp_mul(
    2. gender ENUM('男','女'),
    3. hobby SET('吃饭','睡觉','打豆豆','写代码')
    4. );
    1. INSERT INTO temp_mul VALUES('男','睡觉,打豆豆'); #成功
    2. # Data truncated for column 'gender' at row 1
    3. INSERT INTO temp_mul VALUES('男,女','睡觉,写代码'); #失败
    4. # Data truncated for column 'gender' at row 1
    5. INSERT INTO temp_mul VALUES('妖','睡觉,写代码');#失败
    6. INSERT INTO temp_mul VALUES('男','睡觉,写代码,吃饭'); #成功