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

8e2ybdfx  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(364)

我有一个表,它有一个类型为signed integer的列“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)
我是否缺少位运算符?

nkhmeac6

nkhmeac61#

你需要用这个。

SELECT ( 1024 | 2048 | 1 ) & ~2048

或者用简单的减号。

SELECT ( 1024 | 2048 | 1 ) - 2048

请参见演示http://sqlfiddle.com/#!9月25日
更新查询的用法示例。
假设userextrastatus字段包含 ( 1024 |2048 | 1 = 3073 ) 已经有了。

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

编辑,因为没有评论
有没有一种方法可以在一个查询中混合设置和取消设置位的指令?例如,如果我在一个窗体中为每个位设置了复选框-我不想检查是否已经设置了特定的位-我想设置它从而产生一个查询 UPDATE ... SET status = status | bit1 | bit2 &~ bit3 这是可能的,但你需要像这样使用正确的括号

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

可以使用

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

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

相关问题