【架构思想】告别繁琐的多选值存储,MySQL位运算带你飞!

✨这里是第七人格的博客。小七,欢迎您的到来~✨

🍅系列专栏:【架构思想】🍅

✈️本篇内容:MySQL位运算解决多选值存储问题✈️

🍱本篇收录完整代码地址:无🍱

楔子

小七新入某司,习熟其代码之时,观一SQL,不禁心生迷惑,遂询作者(00后之小邬同学),了其思路,不甚感概,故作此文!

什么是多选值存储问题

工作中经常遇到多选值存储问题,比如某个配置项是星期一到星期天的任意组合。再比如用户修改密码的方式有邮箱验证、手机短信验证、回答密保问题等等,一个用户有可能只开启了其中某几种方式。

多选值存储问题常见解决方案

方案一:多字段存储

一个值对应一个字段。

星期一星期二星期三星期四星期五星期六星期日
0101010

方案二:单字段拼接

单字段存储数据,多个值用分隔符区分。比如以如下方式存储:[星期一,星期二]。JSON存储方式也差不多是这个意思。

方案三:多表关联

使用主表和子表的方式。

方案四:单字段存储,位与查询

该方案主要的思路是,单字段存储的不再是某个具体的类型,而是聚合值。参考Linux权限控制思路,比如 1代表星期一,2代表星期二,那么3则代表星期一和星期二。当然这些代表值并不是胡乱定义的,接下来小七将结合一个具体的例子,实践说明一下。

实践

首先我们为星期一到星期天这七天都定义一个二进制数。定义规则如下:每一个二进制位都代表是否选中,1代表选中,0代表未选中,那么周一到周天对应的二进制数如下:

星期一:0000001

星期二:0000010

......

星期天:1000000

为了方便读者理解,小七建了以下映射表格(注:week_ten为对应的10进制数):

在这里插入图片描述

如果我们需要选中星期一和星期二,那么

0000001+0000010即可,结果为0000011;同理如果我们需要选中周一到周天,那么二进制表示值为1111111。

这样操作有什么好处呢?举个例子,我们一眼就可以看出来

周四(0001000)肯定不在(0000011)中,但它在(1111111)中。

这个值的比较正好符合位运算中的位与。

1、我们要判断周四(0001000)是否在(0000011)的中

0001000

& 

0000011

---------

0000000 转为10进制为 0

2、我们要判断周四(0001000)是否在(1111111)的中

0001000

& 

1111111

---------

0001000 转为10进制为 8 

为了方便演示,小七新建了一张配置表如下:

在这里插入图片描述

-- 判断周四在哪些规则中
SELECT * FROM weeks WHERE weeks & 8 ;
-- 同时包含周一和周四的规则
SELECT * FROM weeks WHERE weeks & 8 and weeks & 1;

总结

如果数据范围有限,且变更不频繁的场景,可以考虑使用位与运算解决多选值存储的问题。

附录

文中实践的表结构与数据

-- ----------------------------

-- Table structure for week

-- ----------------------------

DROP TABLE IF EXISTS `week`;
CREATE TABLE `week`  (
  `id` int(0) NOT NULL,
  `week_ten` int(0) NULL DEFAULT NULL,
  `week_bin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB;

-- ----------------------------

-- Records of week

-- ----------------------------

INSERT INTO `week` VALUES (1, 1, '0000001', '星期一');
INSERT INTO `week` VALUES (2, 2, '0000010', '星期二');
INSERT INTO `week` VALUES (3, 4, '0000100', '星期三');
INSERT INTO `week` VALUES (4, 8, '0001000', '星期四');
INSERT INTO `week` VALUES (5, 16, '0010000', '星期五');
INSERT INTO `week` VALUES (6, 32, '0100000', '星期六');
INSERT INTO `week` VALUES (7, 64, '1000000', '星期天');


-- ----------------------------
-- Table structure for weeks
-- ----------------------------
DROP TABLE IF EXISTS `weeks`;
CREATE TABLE `weeks`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `weeks` int(0) NULL DEFAULT NULL,
  `weeks_bin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB;

-- ----------------------------
-- Records of weeks
-- ----------------------------
INSERT INTO `weeks` VALUES (1, 1, '0000001');
INSERT INTO `weeks` VALUES (2, 127, '1111111');
INSERT INTO `weeks` VALUES (3, 8, '0001000');
INSERT INTO `weeks` VALUES (4, 3, '0000011');
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL 8 之后的版本已经不再提供 32 位的免安装版本。这是因为随着技术的不断发展,64 位的处理器和操作系统早已成为主流,而32 位则逐渐被淘汰。为了适应当前的技术发展趋势,MySQL 8 只提供了 64 位的安装版本。 使用 32 位的系统可能会存在一些限制和问题。首先,32 位的系统最多只能使用 4GB 的内存,而大多数现代计算机都配备了超过 4GB 的内存。使用 64 位的系统可以充分利用计算机的资源,并提供更好的性能和稳定性。 另外,很多新的功能和优化都是针对 64 位系统进行的,无法在 32 位系统上正常运行。这意味着如果使用 32 位的系统,可能无法享受到 MySQL 8 所来的一些新特性。 因此,如果你的系统是 32 位的,想要使用 MySQL 8,你可能需要考虑升级到支持 64 位的操作系统。现在市场上的大多数计算机都支持 64 位系统,不论是 Windows、Linux 还是 macOS,都提供了相应的 64 位版本供用户选择。升级到 64 位系统不仅可以使用 MySQL 8,还能享受到更多的优势和功能。 总之,MySQL 8 不再提供 32 位的免安装版本,这是为了适应当前的技术发展趋势和满足用户需求。如果你想使用 MySQL 8,建议考虑升级到支持 64 位的操作系统。 ### 回答2: MySQL 8 免安装32位版本是MySQL官方提供的一种方便快捷的安装方式。使用该版本可以避免繁琐的安装过程,直接使用MySQL数据库服务。 首先,您可以在MySQL官方网站上下载免安装32位版本的MySQL 8。下载完成后,解压缩文件到您希望安装的目录中。 然后,您需要在解压缩文件的目录中找到一个名为“my.ini”的配置文件,并使用文本编辑器打开。 在“my.ini”文件中,您需要进行如下修改来配置MySQL 8的参数以符合您的需求: - 设置"basedir"参数,指定MySQL的安装目录。 - 设置"datadir"参数,指定MySQL所使用的文件存储目录。 - 设置"port"参数,指定MySQL数据库的端口号。 - 设置"character_set_server"参数,指定服务器的字符集。 - 设置"max_connections"参数,指定服务器的最大连接数。 完成以上修改后,保存并关闭“my.ini”文件。 接下来,您只需双击解压缩文件目录中的一个名为“mysqld.exe”的可执行文件,即可启动MySQL 8数据库服务。 在启动完成后,您可以使用命令行工具或者MySQL客户端连接到MySQL数据库并进行相关操作。 需要注意的是,由于MySQL 8免安装32位版本是一个便携式的版本,所以它不会在系统启动时自动启动,而是需要您手动启动。 总之,通过上述步骤,您可以轻松地使用MySQL 8免安装32位版本,无需繁琐的安装过程。 ### 回答3: MySQL官方并没有提供MySQL 8的32位免安装版本。MySQL 8是一个64位的数据库管理系统,主要针对64位操作系统进行优化和支持。因此,如果您的操作系统是32位的,就无法直接安装MySQL 8。 但是,您仍然可以使用其他版本的MySQL,如MySQL 5.7或更早的版本,这些版本也可以在32位操作系统上运行。您可以从MySQL官方网站上下载适用于32位操作系统的MySQL安装包,并按照官方提供的指南进行安装和配置。 另外,如果您只是需要在32位操作系统上使用MySQL数据库,而不是进行开发和运行生产环境,您还可以考虑使用基于32位的虚拟机或者容器环境来运行MySQL。这样可以克服32位操作系统的限制,并且可以在虚拟机或容器内使用64位版本的MySQL。 总结起来,虽然MySQL 8没有32位免安装版本,但您可以尝试使用适用于32位操作系统的其他MySQL版本,或者使用虚拟机或容器来运行64位版本的MySQL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第七人格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值