mysql存储比特位

news2024/11/20 1:34:36

一、介绍

二、SQL

CREATE TABLE bits_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    bit_value BIGINT UNSIGNED
);
 
-- 插入一个 8 位的 BIT 值
INSERT INTO bits_table (bit_value) VALUES (B'10101010');
 
-- 查询并格式化输出
SELECT 
    id,
    bit_value,
    CONCAT('b', LPAD(BIN(bit_value), 64, '0')) AS formatted_bit_value -- 将 BIGINT 转换为 64 位的二进制字符串
FROM 
    bits_table;

在这个例子中,CONCAT('b', LPAD(BIN(bit_value), 64, '0')) 用于将 bit_value 转换为一个以 'b' 开头的 64 位二进制字符串,LPAD 用于在左边填充 '0' 以达到 64 位的长度。

请注意,如果你需要存储非整数数量的位或者位数不固定,你可能需要以文本形式存储或者使用其他数据库特性来实现。

-- 假设我们有一个表 `bits_table`,其中有一个 `BIGINT` 类型的列 `bigint_col`
-- 我们要修改 `bigint_col` 列的第二位
 
-- 将 `bigint` 转换为 `bit` 字符串,并取得第二位的值
SELECT 
    bigint_col,
    -- 将 `bigint` 转换为 `bit` 字符串,并取得第二位的值
    SUBSTRING(BIN(bigint_col), 2, 1) AS second_bit
FROM
    bits_table;
 
-- 更新第二位为1
UPDATE bits_table
SET 
    bigint_col = 
    -- 将 `bigint` 转换为 `bit` 字符串,将第二位设置为1,然后转换回 `bigint`
    (CONV(CONCAT(SUBSTRING(BIN(bigint_col), 1, 1), '1', SUBSTRING(BIN(bigint_col), 3)), 2, 10)
WHERE
    -- 你的条件语句,比如 id = 1
    id = 1;
<!-- MyBatis的mapper文件 -->
<update id="updateBit">
  UPDATE your_table_name
  SET your_bigint_column = bitor(
    bitand(your_bigint_column, bnot(1 << 20)), 
    (#{value} << 20)
  )
  WHERE your_condition
</update>



这里使用了两个位运算符:

bitand(a, b): 对两个bigint数进行按位与操作。

bitor(a, b): 对两个bigint数进行按位或操作。

bnot(x): 对bigint数进行按位取反操作,结果是把x的第y位取反。

<<: 左移运算符,用于将一个整数左移指定的位数。

确保你的mapper接口中有相应的方法:

UPDATE your_table_name
SET your_bigint_column = BIN(CONV(CONV(your_bigint_column, 2, 10) + POW(2, 19 - 1), 2, 10))
WHERE your_condition;


your_table_name是你的表名,your_bigint_column是你想要更新的列名,your_condition是你的更新条件。

请注意,这个例子中假设了以下几点:

你想要将第20位设置为1。

你的列是无符号的,因此最高位是第20位。如果是有符号的,请适当调整位数。

如果你想将第20位设置为0或某个特定值,只需要将POW(2, 19 - 1)中的1改为你想要设置的值(以二进制表示)。如果是将第20位设置为0,就是POW(2, 19 - 0)

三、demo

1、使用bigint类型存储bit

  总览

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>bit-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/>
    </parent>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--尽量不要同时导入mybatis 和 mybatis_plus,避免版本差异-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>
server.port=6666
server.servlet.context-path=/bitDemo
#mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3308/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=wtyy
#mybatis
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml
#
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
1.1、表
create table demo.user_sys_flag
(
    id      int auto_increment
        primary key,
    flag    bigint      null,
    user_id varchar(50) null
);

1.2、dto与枚举
package com.bit.demo.dto;

import com.baomidou.mybatisplus.annotation.TableName;
import com.bit.demo.enums.UserSysFlagEnums;
import com.bit.demo.util.BitUtil;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@TableName("user_sys_flag")
public class UserSysFlagDTO {

    private Integer id;

    private Long flag;

    private String userId;

    public boolean isEnableFlag1(){
        return BitUtil.isSet(
                flag,
                UserSysFlagEnums.FLAG_1.bitPosition);
    }

    public boolean isEnableFlag2(){
        return BitUtil.isSet(
                flag,
                UserSysFlagEnums.FLAG_2.bitPosition);
    }

    public boolean isEnableFlag60() {
        return BitUtil.isSet(
                flag,
                UserSysFlagEnums.FLAG_60.bitPosition);
    }
}
package com.bit.demo.enums;

public enum UserSysFlagEnums {
    FLAG_1("flag_1",1L),
    FLAG_2("flag_2",1L<<1),
    FLAG_3("flag_3",1L<<2),
    FLAG_60("flag_60",1L<<59);

    public final String key;
    public final Long bitPosition;

    UserSysFlagEnums(String key, Long bitPosition){
        this.key = key;
        this.bitPosition = bitPosition;
    }
}
1.3、dao
package com.bit.demo.repository;

import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bit.demo.dto.UserSysFlagDTO;
import com.bit.demo.mapper.UserSysFlagMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserSysFlagRepository {

    @Autowired
    public UserSysFlagMapper userSysFlagMapper;

    public void insert(UserSysFlagDTO userSysFlagDTO) {
        userSysFlagMapper.insert(userSysFlagDTO);
    }

    public UserSysFlagDTO getByUserId(String userId) {
        LambdaQueryWrapper<UserSysFlagDTO> userQuery = new LambdaQueryWrapper<>();
        userQuery.eq(UserSysFlagDTO::getUserId,userId);
        return userSysFlagMapper.selectOne(userQuery);
    }

    public void updateFlagByUserIdAndIndex(String userId, int index, int indexValue) {
        userSysFlagMapper.updateFlagByUserIdAndIndex(userId,index,indexValue);
    }

    public String queryBitByUserId(Integer bitLength,String userId) {
        return userSysFlagMapper.queryBitByUserId(bitLength,userId);
    }
}
package com.bit.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bit.demo.dto.UserSysFlagDTO;
import org.apache.ibatis.annotations.Param;


public interface UserSysFlagMapper extends BaseMapper<UserSysFlagDTO> {

    void updateFlagByUserIdAndIndex(@Param("userId") String userId,
                                    @Param("index") int index,
                                    @Param("bitValue") int bitValue);

    String queryBitByUserId(@Param("bitLength")Integer bitLength,
                            @Param("userId") String userId);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bit.demo.mapper.UserSysFlagMapper">

    <update id="updateFlagByUserIdAndIndex">
        UPDATE user_sys_flag
        SET flag =
          CASE
            WHEN #{bitValue} = 1 THEN flag | (1 &lt;&lt; ${index})   <!-- Setting the 20th bit to 1 -->
            ELSE flag &amp; ~(1 &lt;&lt; ${index})                     <!-- Setting the 20th bit to 0 -->
          END
        where user_id=#{userId}
    </update>

    <select id="queryBitByUserId" resultType="string">
        SELECT
            CONCAT('b', LPAD(BIN(flag), ${bitLength}, '0')) AS formatted_bit_value
        FROM
            user_sys_flag WHERE
            user_id = #{userId}
    </select>

</mapper>

1.4、service
package com.bit.demo.service.impl;

import com.bit.demo.dto.UserSysFlagDTO;
import com.bit.demo.mapper.UserSysFlagMapper;
import com.bit.demo.repository.UserSysFlagRepository;
import com.bit.demo.service.UserSysFlagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("userSysFlagService")
public class UserSysFlagServiceImpl implements UserSysFlagService {

    @Autowired
    private UserSysFlagRepository userSysFlagRepository;
    @Autowired
    private UserSysFlagMapper userSysFlagMapper;

    @Override
    public void insert(UserSysFlagDTO userSysFlagDTO) {
        userSysFlagRepository.insert(userSysFlagDTO);
    }

    @Override
    public UserSysFlagDTO getByUserId(String userId) {
        return userSysFlagRepository.getByUserId(userId);
    }

    @Override
    public void updateFlagByUserIdAndIndex(String userId, int index, int indexValue) {
        userSysFlagRepository.updateFlagByUserIdAndIndex(userId,index,indexValue);
    }

    @Override
    public String queryBitByUserId(Integer bitLength,String userId) {
        return userSysFlagRepository.queryBitByUserId(bitLength,userId);
    }
}
1.5、util
package com.bit.demo.util;

import com.bit.demo.enums.UserSysFlagEnums;

public class BitUtil {
    public static boolean isSet(long options, long bit) {
        return (options & bit) == bit;
    }
}
1.6、启动类
package com.bit.demo;



import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.bit.demo.mapper")
@SpringBootApplication
public class BitApplication {

    public static void main(String[] args) {
        SpringApplication.run(BitApplication.class, args);
    }
}
1.7、test
package com.bit.demo;

import com.bit.demo.dto.UserSysFlagDTO;
import com.bit.demo.service.UserSysFlagService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest(classes = {BitApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
@Slf4j
public class UserSysFlagTest {

    @Autowired
    private UserSysFlagService userSysFlagService;

    //1、初始化。最大64位,假如需要60个开关,0代表关,1代表开,默认为关。
    @Test
    public void init() {
        UserSysFlagDTO userSysFlagDTO = UserSysFlagDTO.builder()
                .userId("zs")
                .flag(0L)
                .build();
        userSysFlagService.insert(userSysFlagDTO);
    }

    //2、更新,更新第n位的flag
    @Test
    public void update() {
        //将 `bigint` 转换为 `bit` 字符串,将第index位设置为indexValue,然后转换回 `bigint`
        //index从0开始
        String userId = "zs";
        int index = 0;
        int indexValue = 0;
        userSysFlagService.updateFlagByUserIdAndIndex(userId,index,indexValue);
    }

    //3、查询
    @Test
    public void query() {
        UserSysFlagDTO userSysFlagDTO = userSysFlagService.getByUserId("zs");
        log.info(userSysFlagDTO.toString());
        log.info("flag1值为:{}", userSysFlagDTO.isEnableFlag1());
        log.info("flag2值为:{}", userSysFlagDTO.isEnableFlag2());
        log.info("flag60值为:{}", userSysFlagDTO.isEnableFlag60());
    }

    //查询二进制
    @Test
    public void queryBit(){
        Integer bitLength = 64;
        String userId = "zs";
        String bitStr = userSysFlagService.queryBitByUserId(bitLength,userId);
        System.out.println(bitStr);
    }
}
1.8、测试:
(1)初始化

如我初始化了ls,默认是0

(2)更新第1位

   更新ls第1位为1

String userId = "ls";
        int index = 0;
        int indexValue = 1;

 queryBit:可以看到第一位是1了

query:可以看到isEnableFlag1是true了

 (3)更新其他位

如更新第60位为1:

  String userId = "ls";
        int index = 59;
        int indexValue = 1;

 queryBit:可以看到第60位是1了

query:可以看到isEnableFlag1、isEnableFlag60都是true了

(4)再次更新第1位

更新为0,也即关闭功能

String userId = "ls";
        int index = 0;
        int indexValue = 0;
queryBit查看:

query查看:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm run dev启动element-ui,提示node_modules中webpack的版本跟package.json中webpack的版本不一致

问题一&#xff1a;修改node_modules/webpack/package.json版本为4.14.0&#xff0c;npm run dev时版本号又自动更改为 4.47.0 问题二&#xff1a;使用yarn 安装依赖&#xff0c;webpack的版本默认是4.47.0&#xff0c;为什么 求大佬们帮我解答一下以上两个问题 左侧是node_m…

ClickHouse 几年内数据查询及细节

在 ClickHouse 中&#xff0c;查询三年内的时间数据可以使用以下方法&#xff1a; 1. 使用日期函数 可以使用 ClickHouse 支持的日期函数来筛选出三年内的数据。例如&#xff0c;使用 today() 函数获取当天日期&#xff0c;使用 toDate() 函数将日期转换为指定格式&#xff0…

不闭合三维TSP:成长优化算法GO求解不闭合三维TSP(起点固定,终点不定,可以更改数据集),MATLAB代码

一、旅行商问题 旅行商问题&#xff08;Traveling salesman problem, TSP&#xff09;是一个经典的组合优化问题&#xff0c;它可以描述为一个商品推销员去若干城市推销商品&#xff0c;要求遍历所有城市后回到出发地&#xff0c;目的是选择一个最短的路线。当城市数目较少时&…

2024年AI发展的四大趋势

近日&#xff0c;OpenAI发布首个视频生成模型“Sora”——通过接收文本指令&#xff0c;即可生成60秒短视频。一年前&#xff0c;同样是OpenAI发布的语言模型ChatGPT&#xff0c;让文本创作变得易如反掌。 在2023年&#xff0c;随着一系列AIGC的相继问世&#xff0c;我们看到A…

深度学习之基于Pytorch框架的卷积神经网络图像去雨系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在图像处理领域&#xff0c;图像去雨技术一直是一个热门的研究方向。随着深度学习技术的快速发展&am…

2024电工杯数学建模 - 案例:最短时间生产计划安排

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor/article/details/138726153 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#xff0c;预测2022今年国赛也会与该模型相关。 1 模型描…

ASP+ACCESS基于BS产品销售管理系统

2. 网页制作工具 a) 网页设计工具 网页主要使用Frontpage2003&#xff0c;Dreamweaver Mx辅助制作。 Frontpage 2003 frontpage2003是在frontpage2000基础上的网页工具。frontpage2003保留和发展了frontpage 2000的优秀功能&#xff0c;并根据用户的的要求再次增加了九大新…

【MATLAB】基于EMD-PCA-LSTM的回归预测模型

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 基于EMD-PCA-LSTM的回归预测模型是一种结合了经验模态分解&#xff08;Empirical Mode Decomposition, EMD&#xff09;、主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;和长短期记忆…

STM32使用DMA+空闲中断方式实现串口数据接收

欢迎入群共同学习交流 时间记录&#xff1a;2024/5/23 一、概念介绍 &#xff08;1&#xff09;DMA&#xff1a;直接存储器存取(DMA)(Direct Memory Access)也是一个挂载在AHB总线上的外设&#xff0c;用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…

H4vdo 台湾APT-27视频投放工具

地址:https://github.com/MartinxMax/H4vdo 视频 关于 H4vdo RTMP lock 屏播放视频工具&#xff0c;可以向目标发送有效载荷&#xff0c;播放目标的屏幕内容。目标无法曹作计算机 使用方法 安装依赖 根据你的操作系统选择一个安装程序 RTMP 服务端 ./rtsp-simple-server.…

HiWoo Box边缘计算网关

​在数字化浪潮汹涌的今天&#xff0c;边缘计算网关成为了连接物理世界与数字世界的桥梁&#xff0c;其重要性日益凸显。HiWoo Box&#xff0c;作为一款功能强大的边缘计算网关&#xff0c;不仅具备了传统网关的基本功能&#xff0c;更在数据采集、处理、传输等方面展现出了卓越…

不闭合三维TSP:蛇优化算法SO求解不闭合三维TSP(起点固定,终点不定,可以更改数据集),MATLAB代码

旅行商从城市1出发&#xff0c;终点城市由算法求解而定 部分代码 close all clear clc global data load(data.txt)%导入TSP数据集 Dimsize(data,1)-1;%维度 lb-100;%下界 ub100;%上界 fobjFun;%计算总距离 SearchAgents_no100; % 种群大小&#xff08;可以修改&#xff09; …

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

Python自带爬虫库urllib

一、什么是urllib 它是一个http请求的Python自带的标准库&#xff0c;无需安装&#xff0c;直接可以用。并且提供了如下功能&#xff1a;网页请求、响应获取、代理和cookie设置、异常处理、URL解析&#xff0c;可以说是一个比较强大的模块。 二、urllib模块 可分为以下模块&am…

2024中青杯数学建模C题:“X 疾病”在人群中的传播代码论文思路分析

2024中青杯数学建模C题论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

Docker Compose使用

Docker-Compose是什么 docker建议我们每一个容器中只运行一个服务,因为doker容器本身占用资源极少&#xff0c;所以最好是将每个服务单独分割开来&#xff0c;但是这样我们又面临了一个问题&#xff1a; 如果我需要同时部署好多个服务&#xff0c;难道要每个服务单独写Docker…

如何彻底搞懂迭代器(Iterator)设计模式?

说起迭代器&#xff08;Iterator&#xff09;&#xff0c;相信你并不会陌生&#xff0c;因为我们几乎每天都在使用JDK中自带的各种迭代器。那么&#xff0c;这些迭代器是如何构建出来的呢&#xff1f;就需要用到了今天内容要介绍的迭代器设计模式。在日常开发过程中&#xff0c…

刷题之将有序数组转换成二叉搜索树(leetcode)

将有序数组转换成二叉搜索树 正常递归&#xff0c;中序遍历 递归经常会把自己绕晕&#xff0c;还是得画图分析 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(null…

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 380.【中等】O(1) 时间插入、删除和获取随机元素238.【中等】除自身以外数组的乘积134.【中等】 加油站135.【困难】分发糖果42.【困难】接雨水 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面…