MySQL SET

17 Mar 2025 | 5 分钟阅读

SET 是一种字符串对象数据类型,可以包含零个、一个或多个字符串值。它们必须从创建表时指定的预定义值列表中选择。它是 MySQL 数据库中很少使用的数据类型之一。它被称为复杂类型,因为它的实现增加了复杂性。

SET 和 ENUM 数据类型的工作方式相似,因为 MySQL 将它们与预定义的值列表一起使用。但是,有一点不同:ENUM 数据类型只能包含预定义值列表中的单个成员,而 SET 数据类型允许我们同时存储零个或任意数量的值。

如果我们将 SET 列值定义为多个集合成员,则需要使用逗号 (,) 运算符分隔它们。例如,我们定义了一个列为

然后,我们的列可以有以下任何值

SET 数据类型的存储

SET 数据类型在其列中最多可以存储 64 个不同的成员。如果 SET 列包含重复值,则在启用严格 SQL 模式时会抛出错误。

当我们创建表时,如果表定义中的 SET 成员值包含空格,则在执行 CREATE 语句后,它们会自动从表定义中删除。

SET 数据类型在 MySQL 表中存储为数值。它占用一到八个字节(即 1、2、3、4、8),这取决于 SET 列中包含的元素数量。下表说明了 MySQL 中 SET 数据类型的存储要求

元素数量字节数
1-81
9-162
17-243
25-324
33-648

在 MySQL 中,SET 元素存储在位图中,每个成员由单个位值表示。让我们看看下表,它更清楚地说明了这一点

在上述定义中,每个集合成员都分配了一个位,它们具有以下十进制和二进制值

SET 元素十进制值二进制值
Java10001
Python20010
Android40100
PHP81000

现在,如果我们将值 9 分配给此列,以二进制形式表示,它将是 1001。因此,它选择了第一个和第四个 SET 元素,结果值是 “Java, PHP”,它将是 SET 列的第五个成员。

有时我们的 SET 数据类型列包含多个元素;在这种情况下,无需按特定顺序插入值。这意味着元素可以是任何顺序。MySQL 还允许我们在 SET 数据类型列中多次插入相同的元素。当我们检索值时,它将根据表创建时列出的顺序返回每个元素一次。

让我们通过以下示例来理解这一点,我们将创建一个名为 “myset_test” 的表,其中包含一个 SET('Java', 'Python', 'Android', 'PHP') 列

接下来,我们需要将值插入表中

现在,当我们从表中检索值时,我们将得到所有这些值显示为“Java, PHP”,因此执行以下语句以查看此内容

在输出中,我们可以看到我们的 SET 列只有 (Java, PHP) 值

MySQL set

如何更新 SET 数据

MySQL SET 数据类型可以通过三种方式更新数据,如下所示

1. 完全替换 SET 数据

如果我们要将完整数据替换为 SET,则需要指定新值。执行以下语句,其中第一个查询将行 = 4 更新为值 = 'Java, Python',第二个查询将行 = 5 更新为值 = 11。这里,11 表示 8+2+1=Java、PythonPHP

成功执行后,执行以下命令验证输出

输出

MySQL set

2. 添加 SET 成员

有时,需要将元素添加到现有的 SET 列中,那么 CONCAT() 或 CONCAT_WS() 函数允许我们在逗号分隔列表中插入新元素。执行此语句以更清楚地理解它

成功执行后,执行以下命令验证输出

输出

MySQL set

3. 删除 SET 成员

如果要从现有 SET 中删除任何元素,则可以使用 REPLACE() 函数从 SET 列中删除元素。执行此语句以更清楚地理解它

再次,如果您使用十进制值从现有集合中删除元素,请使用按位 AND(&) 运算符和按位 NOT(~) 运算符。执行以下语句

成功执行后,执行以下命令验证输出

输出

MySQL set

如果我们要查看与 SET 成员对应的整数值,则需要将 “+0” 添加到列名中。让我们看以下示例

当我们执行上述语句时,会出现以下结果,其中包含与 SET 成员对应的整数值

MySQL set

使用 SET 数据类型的缺点

SET 数据类型不建议我们在数据库中使用,因为它存在以下缺点

  • SET 数据类型限制我们在列中最多有 64 个成员。
  • 我们不能在 SET 元素中包含逗号。
  • SET 数据未规范化。
  • SET 数据类型只有一个索引,表示整个集合数据。因此,我们无法搜索 SET 的特定元素或成员。

为什么我们使用 SET 数据类型

以下是在 MySQL 中使用 SET 数据类型的原因

  • 它可以轻松处理多个值。
  • 它允许我们比较多个值,而无需使用复杂的 JOIN 操作。
  • 它的架构很简单,只使用一列而不是三个不同的表(例如,Person、Interest、将人员链接到特定兴趣)来存储元素。
  • 它允许我们通过比较单个列上的位值来使用二进制函数进行复杂比较。

下一主题MySQL Decimal