mysql - 设置和清除 MySQL 中存储为整数的多个位

标签 mysql bit-manipulation bit

我有一个表,其中有一列“userExtraStatus”,类型为有符号整数。

我正在存储各种用户状态的位。

要设置位,我有一个查询

UPDATE 
    publicUsers 
SET 
    userExtraStatus = userExtraStatus |1024 |2048 |1 
WHERE 
    userID='1'

所有三位均已设置。列值 = 3073 (1024 + 2048 + 1),据我所知,这是正确的。

如果我尝试取消设置任何位,例如“1024”并保留剩余位,因为我正在使用查询

UPDATE 
    publicUsers 
SET 
    userExtraStatus = userExtraStatus |1024 &~ 2048 | 1 
WHERE 
    userID='1'

结果仍然是3073

预期结果:1025(即 3073 - 2048)

我是否遗漏了按位运算符的某些内容?

最佳答案

你需要使用这个。

SELECT ( 1024 | 2048 | 1 ) & ~2048

或使用简单的减号。

SELECT ( 1024 | 2048 | 1 ) - 2048

查看演示 http://sqlfiddle.com/#!9/bacec0/25

更新查询的用法示例。
假设 userExtraStatus 字段已包含 ( 1024 |2048 | 1 = 3073 )

UPDATE 
    publicUsers 
SET 
    userExtraStatus = (userExtraStatus) & ~2048
WHERE 
    userID='1'

因关闭评论而编辑

Is there a way I can mix instructions for Setting and Unsetting bits in one query? For example If I sumbit a form with checkboxes for each bits - I do not want to check if the particular bit is already set - I want it to be set therefore resulting in a query UPDATE ... SET status = status | bit1 | bit2 &~ bit3

这是可能的,但你需要像这样使用正确的括号

UPDATE ... SET status = ( status | bit1 | bit2 ) & ~bit3

可以通过以下方式取消多个位

UPDATE ... SET status = ( status | bit1 | bit2 ) & ~( bit3 | bit4 )

这是可能的,但你需要像这样使用正确的括号

关于mysql - 设置和清除 MySQL 中存储为整数的多个位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49918087/

相关文章:

random - 来自掩码的均匀随机位

c - 这个表达式 `n = (n<<3)+(n<<1) + ch-' 0', ch=getchar_unlocked();` 的实际含义是什么?

python - 保存 Unicode 时 MySql 出现 "Incorrect string value"错误

mysql - 如何在 ExpressJS 的 mysql 中删除一行?

swift 3 : How to extend [UInt8] to add getUInt32BE function

fortran - "real*8"是什么意思?

c# - 以编程方式为多个字节上的相关位创建位掩码

mysql - 在 Excel 中格式化 MySQL 数据

php - 当我想在 MYSQL 中插入克罗地亚语字母 (č,ć,š,đ,ž) 时,我的函数有什么问题

java - 从二进制数据中提取某些位