暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 11.3.6 SET 类型

原创 由迪 2022-01-11
355

SET是一个字符串对象,可以有零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。 SET包含多个集合成员的列值使用逗号 ( ,)分隔的成员指定。这样做的结果是 SET成员值本身不应包含逗号。

例如,指定为的列SET('one', 'two') NOT NULL可以具有以下任何值:

''
'one'
'two'
'one,two'

一个SET列最多可以有 64 个不同的成员。

如果启用了严格的 SQL 模式,定义中的重复值会导致警告或错误。

SET创建表时, 会自动从表定义中的成员值中删除尾随空格 。

有关该类型的存储要求,请参阅字符串类型存储要求SET

11.3.1节,“字符串数据类型语法”用于 SET类型语法和长度的限制。

检索时,存储在SET列中的值使用列定义中使用的字母大小写显示。请注意,SET可以为列分配字符集和排序规则。对于二进制或区分大小写的排序规则,在为列分配值时会考虑字母大小写。

MySQL 以SET数字方式存储值,存储值的低位对应于第一个集合成员。如果您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')

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 col FROM 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 col FROM 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_name WHERE FIND_IN_SET('value',set_col)>0; mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

第一条语句查找*set_col*包含 *value集合成员的行 。第二个类似,但不一样:它查找set_col*包含 *value*任何位置的行 ,即使是另一个集合成员的子字符串。

也允许以下语句:

mysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

这些语句中的第一个语句查找包含第一个集合成员的值。第二个寻找完全匹配。小心与第二种类型的比较。将设置值与 进行比较返回的结果与将值与 进行比较返回不同的结果 。您应该按照列定义中列出的相同顺序指定这些值。 '*val1*,*val2*'``'*val2*,*val1*'

要确定SET 列的所有可能值,请使用并解析 输出列中的定义。 SHOW COLUMNS FROM *tbl_name* LIKE *set_col*``SET``Type

在 C API 中,SET值作为字符串返回。有关使用结果集元数据将它们与其他字符串区分开来的信息,请参阅 C API 基本数据结构

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论