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

Setting and clearing multiple bits stored as integer in MySQL

我有一个 table,其中有一列 '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 )

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