6.2.3.4 SET 类型SET 是一个字符串对象,它可以有 0 或更多个值,每个值均必须选自一个允许值列表中,该列表在表创建时被指定。包含多个集合成员的 SET 列值,由逗号(“,”)将各成员分隔。由此推论,SET 成员值自身不应该包含逗号。 例如,一个指定为 SET("one", "two") NOT NULL 的列可以有下列任一值: "" "one" "two" "one,two"一个 SET 最大可以有 64 个不同的成员。 从 3.23.51 开始,当表被创建时,SET 值尾部的空格将被自动地删除。 MySQL 以数字值存储 SET 值,以被存储值的低阶比特位(bit)对应于第一个集合成员。如果在一个数字语境中检索一个 SET 值,检索的值把比特位设置为对应组成列值的集合成员。例如,你可以使用下面所示的示例从一个 SET 列中检索出一个数字: mysql> SELECT set_col+0 FROM tbl_name;如果将一个数字存储到一个 SET 列中,被设置的数字的二进制表示法的比特位决定列值中的集合成员。假设一个列被定义为 SET("a","b","c","d")。那么它的成员有下面所示的比特值: SET 成员 十进制值 二进制值 a 1 0001 b 2 0010 c 4 0100 d 8 1000 如果将值 9(二进制的 1001) 赋给这个列,那么 SET 值的第一个和第四个成员 "a" 和 "d" 被选择,结果值为 "a,d"。 对于包含超过一个 SET 成员的值,当你插入值时,无所谓以什么顺序列出成员。也无所谓给出的值被列举了多少次。当以后检索该值时,在值中的每个成员将出现一次,根据他们在表创建时所指定的顺序列出成员。例如,如果一个列被定义为 SET("a","b","c","d"),那么,"a,d"、"d,a" 和 "d,a,a,d,d" 在被检索时均将被视为 "a,d"。 如果将一个不支持的值赋于一个 SET 列,该值将被忽略。 SET 以数字顺序排序。NULL 值排在非 NULL SET 值之前。 通常,可以使用 LIKE 操作符或 FIND_IN_SET() 函数执行在一个 SET 列上的 SELECT: mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;但是,下列示例也可以工作: mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2'; mysql> SELECT * FROM tbl_name WHERE set_col & 1;第一个语句寻找一个精确的匹配。第二个语句寻找包含第一个集合成员的值。 如果希望得到一个 SET 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE set_column_name 并分析第二列的 SET 定义。
具体操作请看manual之merge table章节!
"one"
"two"
"one,two"一个 SET 最大可以有 64 个不同的成员。 从 3.23.51 开始,当表被创建时,SET 值尾部的空格将被自动地删除。 MySQL 以数字值存储 SET 值,以被存储值的低阶比特位(bit)对应于第一个集合成员。如果在一个数字语境中检索一个 SET 值,检索的值把比特位设置为对应组成列值的集合成员。例如,你可以使用下面所示的示例从一个 SET 列中检索出一个数字: mysql> SELECT set_col+0 FROM tbl_name;如果将一个数字存储到一个 SET 列中,被设置的数字的二进制表示法的比特位决定列值中的集合成员。假设一个列被定义为 SET("a","b","c","d")。那么它的成员有下面所示的比特值: SET 成员 十进制值 二进制值
a 1 0001
b 2 0010
c 4 0100
d 8 1000 如果将值 9(二进制的 1001) 赋给这个列,那么 SET 值的第一个和第四个成员 "a" 和 "d" 被选择,结果值为 "a,d"。 对于包含超过一个 SET 成员的值,当你插入值时,无所谓以什么顺序列出成员。也无所谓给出的值被列举了多少次。当以后检索该值时,在值中的每个成员将出现一次,根据他们在表创建时所指定的顺序列出成员。例如,如果一个列被定义为 SET("a","b","c","d"),那么,"a,d"、"d,a" 和 "d,a,a,d,d" 在被检索时均将被视为 "a,d"。 如果将一个不支持的值赋于一个 SET 列,该值将被忽略。 SET 以数字顺序排序。NULL 值排在非 NULL SET 值之前。 通常,可以使用 LIKE 操作符或 FIND_IN_SET() 函数执行在一个 SET 列上的 SELECT: mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;但是,下列示例也可以工作: mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;第一个语句寻找一个精确的匹配。第二个语句寻找包含第一个集合成员的值。 如果希望得到一个 SET 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE set_column_name 并分析第二列的 SET 定义。