logo图片
MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

MySQL SET

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数据类型的存储要求:
数值 字节数
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)值:
MySQL set

如何更新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;
输出
MySQL set

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;
输出
MySQL set

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;
输出
MySQL set
如果我们想看到对应于SET成员的整数值,那么我们需要在列名中添加 " + 0" 。让我们看下面的例子:
Mysql> SELECT Id, myset_col, myset_col+0 FROM myset_test;
当我们执行以上语句时,将出现以下结果,其中包含与SET成员相对应的整数值:
MySQL set

使用SET数据类型的缺点

由于以下缺点,SET数据类型不建议我们在数据库中使用它:
SET数据类型将我们限制为该列中的64个成员。 我们不能在SET元素中添加逗号。 SET数据未标准化。 SET数据类型只有一个表示整个集合数据的索引。因此,我们无法搜索SET的特定元素或成员。

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

以下是使用SET MySQL中的数据类型:
它可以轻松处理多个值。 它使我们无需使用复杂的JOIN操作即可比较多个值。 它的架构很简单,只使用一列而不是三个不同的表(例如,"人","兴趣","将人链接到特定兴趣")来存储元素。 通过比较单个列上的位值,它使我们可以将二进制函数用于复杂的比较。
昵称: 邮箱:
Copyright © 2020 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4