我有一个表'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运算符?
答案 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 )
这是可能的,但你需要使用正确的括号,如此