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

时间:2018-04-19 09:56:15

标签: mysql bit-manipulation bits

我有一个表'userExtraStatus',其类型为signed integer。

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

设置我有查询的位

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)

我是否错过了Bitwise运算符?

1 个答案:

答案 0 :(得分:2)

你需要使用它。

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'

编辑因为发表评论

  

有没有办法可以混合设置和取消设置位的指令   在一个查询?例如,如果我使用每个复选框对表单进行汇总   位 - 我不想检查特定位是否已设置 - I   希望它被设置,从而导致查询UPDATE ... SET status = status | bit1 | bit2 &~ bit3

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

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

可以取消设置多个位
UPDATE ... SET status = ( status | bit1 | bit2 ) & ~( bit3 | bit4 )

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