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~8个字节(即1、2、3、4、8),具体取决于SET列中包含的元素数量。下表解释了SET数据类型在MySQL中的存储要求:
No. of Elements | No. of Bytes |
---|---|
1-8 | 1 |
9-16 | 2 |
17-24 | 3 |
25-32 | 4 |
33-64 | 8 |
在MySQL中,集合元素存储在 位图 中,其中每个成员由一个单独的位值表示。让我们看一下下面的表格,更清楚地说明了它:
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,需要指定新值。执行以下语句,其中第一个查询将row = 4的值更新为’Java, Python’,第二个查询将row = 5的值更新为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,将人与特定兴趣联系起来)来存储元素。
- 它允许我们通过在单个列上比较位值来使用二进制函数进行复杂比较。