📜  MySQL SET

📅  最后修改于: 2020-11-19 02:06:17             🧑  作者: Mango

MySQL设置

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

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

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

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

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

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

存储SET数据类型

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

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

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

No. of Elements No. of Bytes
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 Element Decimal Value Binary Value
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,则需要指定新值。执行以下语句,其中第一个查询使用值='Java, Python'更新行= 4,第二个查询用值= 11更新行=5。这里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操作。
  • 它的架构很简单,只使用一列而不是三个不同的表(例如,“人”,“兴趣”,“将人链接到特定兴趣”)来存储元素。
  • 通过比较单个列上的位值,它使我们可以使用二进制函数进行复杂的比较。