设置和清除MySQL中存储为整数的多个位
我有一个表,其中有一列“userExtraStatus”,类型为带符号整数 我正在为各种用户状态存储位 要设置位,我有一个查询设置和清除MySQL中存储为整数的多个位,mysql,bit-manipulation,bits,Mysql,Bit Manipulation,Bits,我有一个表,其中有一列“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(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
见演示
更新查询的示例用法假设字段userExtraStatus已经包含
(1024 | 2048 | 1=3073)
UPDATE
publicUsers
SET
userExtraStatus = (userExtraStatus) & ~2048
WHERE
userID='1'
因未发表评论而编辑
是否有一种方法可以混合设置和取消设置位的说明 在一个查询中?例如,如果我在一个表单中使用复选框 位-我不想检查特定位是否已设置-I 希望将其设置为导致查询
更新。。。设定状态
=状态|位1 |位2&~位3
这是可能的,但你需要像这样使用适当的括号
UPDATE ... SET status = ( status | bit1 | bit2 ) & ~bit3
可以通过以下方式取消设置多个位:
UPDATE ... SET status = ( status | bit1 | bit2 ) & ~( bit3 | bit4 )
这是可能的,但您需要使用适当的括号,如这样,您需要使用此括号
SELECT ( 1024 | 2048 | 1 ) & ~2048
或者使用简单的减号
SELECT ( 1024 | 2048 | 1 ) - 2048
见演示
更新查询的示例用法假设字段userExtraStatus已经包含
(1024 | 2048 | 1=3073)
UPDATE
publicUsers
SET
userExtraStatus = (userExtraStatus) & ~2048
WHERE
userID='1'
因未发表评论而编辑
是否有一种方法可以混合设置和取消设置位的说明 在一个查询中?例如,如果我在一个表单中使用复选框 位-我不想检查特定位是否已设置-I 希望将其设置为导致查询
更新。。。设定状态
=状态|位1 |位2&~位3
这是可能的,但你需要像这样使用适当的括号
UPDATE ... SET status = ( status | bit1 | bit2 ) & ~bit3
可以通过以下方式取消设置多个位:
UPDATE ... SET status = ( status | bit1 | bit2 ) & ~( bit3 | bit4 )
这是可能的,但您需要使用适当的括号,例如是否有一种方法可以在一个查询中混合设置和取消设置位的指令?例如,如果我在表单中为每个位设置复选框-我不想检查特定位是否已设置-我希望设置它,从而导致查询更新。。。设置状态=状态|位1 |位2&~bit3@Didzis这是可能的,但您需要使用适当的括号,如so
UPDATE。。。设置状态=(状态|位1 |位2)和~bit3
通过更新可以取消设置多个位。。。设置状态=(状态|位1 |位2)和|位3 |位4)
Ah-ha,太棒了!非常感谢。如果你能用这些评论更新你以前的答案,我会将其标记为接受。有没有一种方法可以在一个查询中混合设置和取消设置位的说明?例如,如果我在表单中为每个位设置复选框-我不想检查特定位是否已设置-我希望设置它,从而导致查询更新。。。设置状态=状态|位1 |位2&~bit3@Didzis这是可能的,但您需要使用适当的括号,如soUPDATE。。。设置状态=(状态|位1 |位2)和~bit3
通过更新可以取消设置多个位。。。设置状态=(状态|位1 |位2)和|位3 |位4)
Ah-ha,太棒了!非常感谢。如果你能用这些评论更新你以前的答案,我会将其标记为接受。