📅  最后修改于: 2020-11-19 02:06:17             🧑  作者: Mango
SET是String对象的数据类型,可以容纳零个或多个或任意数量的字符串值。必须从表创建期间指定的值的预定义列表中选择它们。它是MySQL数据库中很少使用的数据类型之一。之所以称为复杂类型,是因为其实现会增加复杂性。
SET和ENUM数据类型的工作方式类似,因为MySQL将其与预定义的值列表一起使用。但是有一点不同,ENUM数据类型只能容纳预定义值列表的单个成员,而SET数据类型允许我们将零个或任意数量的值存储在一起。
如果我们使用多个set成员定义SET列值,则需要使用逗号(,)运算符将其分开。例如,我们将列定义为:
SET (''one'', ''two'') NOT NULL
然后,我们的列可以具有以下任何值:
''
'one'
'two'
'one,two'
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)值:
MySQL 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;
输出量
有时,需要将元素添加到现有的SET列中,然后CONCAT()或CONCAT_WS()函数允许我们在逗号分隔的列表中插入新元素。执行此语句以更清楚地理解它:
mysql> UPDATE myset_test SET myset_col = CONCAT(myset_col, ", Python") WHERE Id = 3;
成功执行后,执行以下命令以验证输出:
mysql> SELECT * FROM myset_test;
输出量
如果要从现有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数据类型不建议我们在数据库中使用它:
以下是在MySQL中使用SET数据类型的原因: