MySQL SET类型

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

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

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

SET (''one'', ''two'') NOT NULL  

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

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

一、SET 数据类型的存储

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

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

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

元素数量 字节数
1-8 1
9-16 2
17-24 3
25-32 4
33-64 8

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

CREATE TABLE myset_test(  
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
    Myset SET('Java','Python','Android','PHP')  
  );  

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

SET元素 十进制值 二进制值
Java 1 0001
Python 2 0010
Android 4 0100
PHP 8 1000

 现在,如果我们为该列分配值 9,就二进制而言,它将是 1001。因此,它选择第一个和第四个 SET 元素,结果值为''Java, PHP'',这将是SET 列的第五个成员。

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

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

mysql> CREATE TABLE myset_test (  
  Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   
  Myset_col SET('Java', 'Python', 'Android', 'PHP')  
);  

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

INSERT INTO myset_test(Myset_col) VALUES ('Java,PHP'), ('PHP,Java'),   
('Java,PHP,Java'), ('Java,PHP,PHP'), ('PHP,Java,PHP');  

现在,当我们从表中检索值时,我们将使所有这些值显示为“ Java, PHP" 所以执行下面的语句可以看到:

mysql> SELECT * FROM myset_test;  

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

二、如何更新 SET 数据

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

1、通过完全替换SET数据

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

mysql> UPDATE myset_test SET myset_col = 'Java, Python' WHERE Id = 4;  
mysql> UPDATE myset_test SET myset_col = 11 WHERE Id = 5;  

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

mysql> SELECT * FROM myset_test;  

输出结果为:

2、通过添加SET成员

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

mysql> UPDATE myset_test SET myset_col = CONCAT(myset_col, ", Python") WHERE Id = 3;  

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

mysql> SELECT * FROM myset_test;  

输出结果为:

3、通过删除 SET 成员

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

mysql> UPDATE myset_test SET myset_col = REPLACE(myset_col, "Python", "") WHERE Id = 4;

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

mysql> UPDATE myset_test SET myset_col = myset_col & ~2 WHERE Id = 4;  

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

mysql> SELECT * FROM myset_test;  

输出结果为:

如果我们想看到 SET 成员对应的整数值,那么我们需要在列名后面加上“+0” 。让我们看看下面的例子:

mysql> SELECT Id, myset_col, myset_col+0 FROM myset_test;  

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

三、使用 SET 数据类型的缺点

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

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

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

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

  • 它可以轻松处理多个值。
  • 它允许我们在不使用复杂的 JOIN 操作的情况下比较多个值。
  • 它的模式很简单,只使用一列而不是三个不同的表(例如,Person、Interest、Link the people to specific interest)来存储元素。
  • 它允许我们通过比较单个列上的位值来使用二进制函数进行复杂的比较。

热门文章

优秀文章