设置和清除 MySQL 中存储为整数的多个位
Setting and clearing multiple bits stored as integer in MySQL
我有一个 table,其中有一列 '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 )
这是可能的,但你需要像这样使用适当的括号
我有一个 table,其中有一列 '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 )
这是可能的,但你需要像这样使用适当的括号