我有一个表,其中有一列“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/