SET 类型
SET
是可以具有零个或多个值的字符串对象,每个值都必须从创建表时指定的允许值列表中选择。SET
由多个set成员组成的列值用用逗号(,
)分隔的成员指定。这样的结果是SET
成员值本身不应包含逗号。
例如,指定为的列SET('one','two')NOT NULL
可以具有以下任何值:
'' 'one' 'two' 'one,two'
一SET
列最多可包含64个不同的成员。
定义中的重复值会导致警告,如果启用了严格的SQL模式,则会导致错误。
SET
创建表时,会从表定义中的成员值中自动删除尾随空格。
检索到后,SET
将使用列定义中使用的字母大小写来显示存储在列中的值。请注意,SET
可以为列分配一个字符集和校验规则。对于二进制或区分大小写的归类,在为列分配值时考虑字母大小写。
MySQL以SET
数字方式存储值,存储值的低位对应于第一个set成员。如果SET
在数字上下文中检索值,则检索到的值具有与组成列值的集合成员相对应的位集合。例如,您可以从SET
像这样的列中检索数值:
mysql>SELECT set_col +0FROM 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')
:
mysql>CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
如果插入值'a,d'
,'d,a'
,'a,d,d'
,'a,d,a'
,和'd,a,d'
:
mysql>INSERT INTO myset (col)VALUES -> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0
然后所有这些值显示为'a,d'
检索时的形式:
mysql>SELECT colFROM myset; +------ + | col | +------ + | a,d | | a,d | | a,d | | a,d | | a,d | +------ + 5 rows in set (0.04 sec)
如果将SET
列设置为不支持的值,则该值将被忽略并发出警告:
mysql>INSERT INTO myset (col)VALUES ('a,d,d,s'); Query OK, 1 row affected, 1 warning (0.03 sec) mysql>SHOW WARNINGS ; +--------- +------ +------------------------------------------ + | Level | Code | Message | +--------- +------ +------------------------------------------ + | Warning | 1265 | Data truncated for column 'col' at row 1 | +--------- +------ +------------------------------------------ + 1 row in set (0.04 sec) mysql>SELECT colFROM myset; +------ + | col | +------ + | a,d | | a,d | | a,d | | a,d | | a,d | | a,d | +------ + 6 rows in set (0.01 sec)
如果启用了严格的SQL模式,则尝试插入无效SET
值将导致错误。
SET
值按数字校验。NULL
值在非NULL
SET
值之前校验。
诸如SUM()
或AVG()
期望数字参数的函数在必要时将参数强制转换为数字。对于SET
值,强制转换操作将导致使用数值。
通常,您SET
使用FIND_IN_SET()
函数或LIKE
运算符搜索值:
mysql>SELECT *FROM tbl_nameWHERE FIND_IN_SET('value',set_col)>0; mysql>SELECT *FROM tbl_nameWHERE set_col LIKE '%value%';
第一条语句查找set_col
包含value
set成员的行。第二个相似,但不相同:它查找set_col
包含value
任何位置的行,甚至作为另一个set成员的子字符串。
也允许使用以下语句:
mysql>SELECT *FROM tbl_nameWHERE set_col & 1; mysql>SELECT *FROM tbl_nameWHERE set_col = 'val1,val2';
这些语句中的第一个语句查找包含第一个set成员的值。第二个寻找完全匹配。注意第二种类型的比较。比较设定值所返回的结果不同于将数值与进行比较。您应该按照列定义中列出的顺序指定值。'val1,val2'
'val2,val1'
要确定SET
列的所有可能值,请使用并解析输出列中的定义。SHOW COLUMNS FROM tbl_name LIKE set_col
SET
Type
在C API中,SET
值以字符串形式返回。有关使用结果集元数据将它们与其他字符串区分开的信息,请参见“ C API数据结构”。