首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql的set

基础概念

MySQL中的SET是一种数据类型,用于存储一个或多个值。它类似于其他编程语言中的数组或集合,但有一些特定的语法和限制。SET类型的列可以存储预定义的值集合中的一个或多个值。

相关优势

  1. 灵活性SET类型允许在一个字段中存储多个值,这在某些情况下比使用单独的字段或多个记录更为高效。
  2. 节省空间:相比于使用多个布尔字段或单独的关联表,SET类型通常可以节省存储空间。
  3. 简化查询:通过使用SET类型,可以更容易地查询和操作包含多个值的字段。

类型

MySQL中的SET类型有以下几种:

  • ENUM:类似于SET,但每个值只能出现一次,且值的顺序很重要。
  • SET:允许存储多个值,值的顺序不重要。

应用场景

SET类型常用于以下场景:

  • 标签系统:存储与某个项目相关联的多个标签。
  • 权限管理:表示用户具有的多个权限。
  • 配置选项:存储多个可选配置项。

遇到的问题及解决方法

问题1:插入非法值

原因:尝试插入不在预定义集合中的值。

解决方法:在插入数据之前,验证要插入的值是否在允许的集合中。可以使用MySQL的CHECK约束来限制插入的值。

代码语言:txt
复制
CREATE TABLE example (
    id INT PRIMARY KEY,
    permissions SET('read', 'write', 'delete') NOT NULL
);

问题2:查询特定值

原因:需要查询包含某个特定值的记录。

解决方法:使用FIND_IN_SET函数来查询包含特定值的记录。

代码语言:txt
复制
SELECT * FROM example WHERE FIND_IN_SET('read', permissions);

问题3:更新值

原因:需要更新SET字段中的值。

解决方法:使用位运算符或UPDATE语句来更新SET字段中的值。

代码语言:txt
复制
-- 使用位运算符更新值
UPDATE example SET permissions = permissions | POWER(2, 1) WHERE id = 1;

-- 使用UPDATE语句更新值
UPDATE example SET permissions = 'read,write' WHERE id = 1;

参考链接

请注意,以上链接指向的是MySQL官方文档,以获取最准确和最新的信息。在实际应用中,建议根据具体需求和场景选择合适的数据类型和操作方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysqlSET类型

SET类型 SET表示一个字符串对象,可以包含0个或多个成员,但成员个数上限为64。设置字段值时,可以取 取值范围内 0 个或多个值。...当SET类型包含成员个数不同时,其所占用存储空间也是不同,具体如下: 成员个数范围(L表示实际成员个数) 占用存储空间 1 <= L <= 8 1个字节...'), ('A,B'); SELECT * FROM test_set; [在这里插入图片描述] 插入重复SET类型成员时,MySQL会自动删除重复成员#插入重复SET类型成员时,MySQL会自动删除重复成员...INSERT INTO test_set (s) VALUES ('A,B,C,A');[在这里插入图片描述] 向SET类型字段插入SET成员中不存在值时,MySQL会抛出错误。...#向SET类型字段插入SET成员中不存在值时,MySQL会抛出错误。

1.7K30

MYSQL Write Set 疑惑?

基于MYSQL 组复制,其实已经是一项成熟技术了,从MYSQL 5.6 开始,到目前8 ,属于接近初成熟阶段。...首先我们要理解两个事情,为什么要组复制,理由无非两个 1 提供成员之间更快复制 2 提供多成员之间认证 到底WRITE-SET 比原先复制哪里快了 首先我们要了解几个问题和相关参数 binlog_transaction_dependency_tracking...这个参数有三个设置选择项 1 commit_order 默认值,在从库进行顺序型应用 2 writeset 依赖主库事务关联性,在从库可以进行非顺序型并行应用 3 writeset_session...和第二点不同在于SESSION隔离性 我们可以比对 commit_order 和 writeset_session 之间区别 首先我们可以创建一个表,并插入记录,然后观察LOG 中两个不同参数变化...所有我测试对象又转移到,传统GTID 复制机器上面, 两台机器然后最简单主从复制,然后将复制方式改为 set global binlog_transaction_dependency_tracking

1.6K30
  • 使用带有MySQL RouterReplica Set

    使用带有MySQL RouterReplica Set 您可以使用MySQL Router 8.0.19和更高版本对replica set进行引导,就像可以引导InnoDB cluster一样,将MySQL...生成MySQL路由器配置文件唯一区别是添加了cluster_type选项。...将MySQL路由器引导到副本集时,生成配置文件包括: cluster_type=rs 将MySQL Router与Replica Set一起使用时,请注意: MySQL Router读写端口将客户端连接指向...Replica Set主实例 MySQL Router只读端口将客户端连接定向到Replica Set从实例,尽管它也可以将它们定向到主实例 MySQL Router从主实例获取Replica Set...拓扑信息 当主实例不可用并且升级了另一个实例时,MySQL Router会自动恢复 只需要运行下面这条命令即可将来集群信息注册到MySQL Router中 mysqlrouter --bootstrap

    2K00

    MySQL 案例:update set 和 and 故事

    问题描述 最近接到一个奇怪咨询,update 语句执行没有报错,但是没有更新数据,具体有问题语句类似于如下形式: update test.stu set cname = '0' and math =...那么基于腾讯云数据库 MySQL,实际构造一个简单场景,尝试复现一下这个问题。...由此可见,MySQL 在语法上,并不认为 and 这个用法是错误,那么说明 MySQL 用另外方式“解读”了这个语句。...最容易想到,就是 MySQL 是不是在 set 时候,把 and 解释成了逻辑运算符,而不是英文意义上“和”?...,仔细分析这个语句,会发现 MySQL 按照如下方式来处理: set cname = ('0' and math = 90 and his = 80) math 和 his 取值是根据 where 条件筛选行来决定

    1.9K90

    MySQLSET类型学习--MySql语法

    对于二进制或大小写敏感校对规则,当为列分配值时应考虑大小写。 MySQL用数字保存SET值,所保存值低阶位对应第1个SET成员。...例如,你可以这样从一个SET列检索数值值: mysql> SELECT set_col+0 FROM tbl_name; 如果将一个数字保存到SET列中,数字中二进制表示中位确定了列值中SET成员。...(0.04 sec) 如果将SET列设置为一个不支持值,则该值被忽略并发出警告: mysql> INSERT INTO myset (col) VALUES ('a,d,d,s'); Query OK...)>0; mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; 第1个语句找出SET_col包含value set成员行。...下面的语句也是合法mysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col

    4.3K10

    MYSQL 8 如何定住你 set variables

    这里面熟悉MYSQL就会体会到一个情况,就是我my.cnf 和 我实际配置各种变量,可能是不同,有的变量还好,在MYSQL重启动后变回my.cnf 配置,但有的时候变回去后,可能会给你出乱子...一般配置MYSQL参数时候,如果我在MYSQL 运行时候,配置一些系统或全局变量时,如果是决定事情,我是会将这些配置,写入到my.cnf ,下次启动一般不会有事情,但怕就是忘记了,或一些紧急处理情况下...这个功能就是 SET PERSIST 方式来设置你变量 我们举例 在MYSQL 8 中查看当前 innodb_buffer_pool_size ?...并且我在重启 MYSQL 后相关配置选项不会丢失 ? 当然如果你删除了记录文件,则相关配置在MYSQL 再次启动后就失效了。...select a.VARIABLE_NAME,b.VARIABLE_value ,SET_TIME,SET_USER,SET_HOST from performance_schema.variables_info

    1.1K20

    MySQL几个character_set变量说明

    参考: http://www.th7.cn/db/mysql/201412/84636.shtml MySQL关于character有如下8个变量: character_set_client character_set_connection...我们登陆进mysql后,执行 set names utf8; 实际就是同时修改上面的这3个参数值。...从实际上可以看到,当客户端连接服务器时候,它会将自己想要字符集名称发给mysql服务器,然后服务器就会使用这个字符集去设置character_set_client、character_set_connection...如果我们想告诉mysql server自己本次连接想使用latin1,则命令行下可以如下写法: mysql -uroot -h 192.168.2.11 -pAbcd@1234 --default-character-set...此外,要修改上面的3个字符集的话, 还可以在my.cnf[mysql]段里面增加: default-character-set=latin1 也可以登录进去后,执行set names latin1效果相同

    2.6K10

    mysql 函数: find_in_set()、instr()

    1. find_in_set() 用于在多个字符串子链中查询字符串 ---- find_in_set(str, strlist) str: 要查询字符串 strlist: 字段名或字符串, 多个子链以英文逗号...`分割 返回值: 假如字符串 str 在由 N 个子链组成字符串列表 strlist 中,则返回值范围在 1 到 N 之间, 不在 strlist 中则返回 0 以下示例中返回值则为: 3 , 因为字符串...yang 在第三个子链中 select find_in_set('yang', 'liang,chen,yang'); 应用场景: 在文章表 article 中有个标签字段 tags,一个文章可以有多个标签...标签 id: 1 html 2 css 3 javascript, tags 以 1,2,3 格式存储标签,那么我们可以使用 find_in_set 查找出 tags 中有 1 标签 select...* from article where find_in_set(1, `tags`); 2. instr() 用于在字符串中查询子字符串 ---- 用于在字符串中查询子字符串, 返回子字符串在字符串中首次出现位置

    94130

    mysql中FIND_IN_SET使用方法

    mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值记录,但是它也不是用like能解决,使用like可能查到我们不想要记录,它比like更精准,这时候mysqlFIND_IN_SET...FIND_IN_SET(str,strlist)函数 str 要查询字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)结果,返回结果为...下面查询btype字段中包含”15″这个参数值 SELECT * from test where FIND_IN_SET('15',btype) 返回值 下面查询btype字段中包含”5″这个参数值...接下面查询btype字段中包含”20″这个参数值 SELECT * from test where FIND_IN_SET('20',btype) 当然它返回值为null,因为字段中没有这个值 FIND_IN_SET...和like区别 like是广泛模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询结果要小于like查询结果。

    23510

    技术分享 | MySQL InnoDB Cluster Set 介绍

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关备份恢复、SQL 调优、监控运维、高可用架构设计等。...MySQL Shell 用来进行 MGR 日常运维,MySQL Router 对上层应用提供一个简单读写分离入口,MySQL MGR 则是用来存放真实数据多个 MySQL 实例。...如果你一直使用 MySQL 8.0 ,并且保持 MySQL 版本一直为最新,那答案是肯定(最新 MySQL 8.0 小版本为 8.0.28 ),新名字为 MySQL InnoDB Cluster Set...由于数据传输依赖传统 MySQL 异步复制(不能使用半同步),无法避免异步复制缺陷:数据延迟、数据一致性、需要手动故障转移等等。 从库不能是已有的 MIC ,必须新建。...":"clone"}) 看下 ytt-rc-set 最新状态:ytt-rc1 为主,ytt-rc2 为备。

    65020

    技术分享 | MySQL InnoDB Cluster Set 介绍

    作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关备份恢复、SQL 调优、监控运维、高可用架构设计等。...MySQL Shell 用来进行MGR日常运维,MySQL Router 对上层应用提供一个简单读写分离入口,MySQL MGR 则是用来存放真实数据多个 MySQL 实例。...如果你一直使用 MySQL 8.0,并且保持 MySQL 版本一直为最新,那答案是肯定(最新 MySQL 8.0 小版本为 8.0.28),新名字为 MySQL InnoDB Cluster Set...由于数据传输依赖传统 MySQL 异步复制(不能使用半同步),无法避免异步复制缺陷:数据延迟、数据一致性、需要手动故障转移等等。 从库不能是已有的 MIC ,必须新建。...":"clone"}) 看下 ytt-rc-set 最新状态:ytt-rc1 为主,ytt-rc2 为备。

    89330

    MySQL中FIND_IN_SET探险记

    ,但是它也不是用like能解决,使用like可能查到我们不想要记录,它比like更精准,查找资料后发现涉及到数据库特有函数,候mysqlFIND_IN_SET函数就派上用场了,下面来具体了解一下...SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET (102,ancestors) ? 疑问01:where 后面这跟是条件吗?...FIND_IN_SET(str,strlist) 第一个参数str是要查找字符串。 第二个参数strlist是要搜索逗号分隔字符串列表。...贴图: SELECT FIND_IN_SET(1,1) ? 刚说好字符串,你就给我来个这 ? ? ? ,mysql你怎么可以这么随意呢! ? ? ? 以上图示,有劳读友自行总结 ? ? ?...5、FIND_IN_SET和like区别 like是广泛模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询结果要小于like查询结果

    1.9K10

    MySQL find_in_set函数深入解析与应用

    在数据库操作中,我们经常会遇到需要处理以逗号分隔字符串,并且需要根据这些字符串进行查询情况。MySQL提供了一个非常实用函数FIND_IN_SET()来处理这种特定查询需求。...本文将深入解析FIND_IN_SET()函数使用方法,并通过具体应用场景来展示其强大功能。 什么是FIND_IN_SET()?...FIND_IN_SET()是MySQL一个字符串函数,用于搜索一个字符串在另一个逗号分隔字符串列表中位置。如果找到匹配,它返回一个大于0整数表示位置,否则返回0。...FIND_IN_SET()基本使用 让我们看一个简单例子,如何使用FIND_IN_SET()函数来查找喜欢阅读用户。...FIND_IN_SET()函数只能用于字符类型字段,不能用于数字类型字段。 性能考虑 虽然FIND_IN_SET()在某些场景下非常有用,但它通常不被认为是性能最优选择。

    89010

    【说站】mysqlset类型如何理解

    mysqlset类型如何理 说明 1、set和enum很像,也是一个字符串对象,可以包含0~64个成员。 根据成员数量不同,存储器也不同。set类型可以一次选择多个成员。...2、可以从允许值集中选择任何元素进行组合,因此只要输入值在允许值组合范围内,就可以正确记录在set类型列中。 对超出允许范围值,报错。而且有重复成员集合,会自动去重。...实例 --创建表ts,包含字段f1(set()) mysql> create table ts (f1 set('a','b','c','d')); mysql> insert into ts values...('a,b'),('a,d'),('b,c,d'); 以上就是mysqlset类型理解,希望对大家有所帮助。...更多mysql学习指路:MySQL 推荐操作系统:windows7系统、mysql5.8、DELL G3电脑 收藏 | 0点赞 | 0打赏

    74630
    领券