如何在mysql查询中更新标志位?

unk*_*its 4 mysql

这是我的sql查询,在flag(00000)每个位位置都有不同的规范,例如change 4th bit position to 1 when user is inactive.这里标志是varchar数据类型(String).

$sql="select flag from user where id =1"
Run Code Online (Sandbox Code Playgroud)

我有

flag=10001 #it may be flag="00001" or flag="00101"
Run Code Online (Sandbox Code Playgroud)

我想将此标志的第2位更新为1.

$sql="update user set flag='-1---' where id=1" #it may be flag='11001' or flag='01001' or flag='01110'
Run Code Online (Sandbox Code Playgroud)

实际上,我想将这个标志的第2位更新为1,但不要像flag ='11001'那样更新它.我想做这样的事情.

$sql="update user set flag='--change(flag,2bit,to1)--' where id =1" #this is wrong
Run Code Online (Sandbox Code Playgroud)

我能做些什么,只使用一个SQL查询?有可能吗?

Bar*_*mar 6

update user
set flag = lpad(conv((conv(flag, 2, 10) | 1 << 3), 10, 2), 5, '0')
where id = 1
Run Code Online (Sandbox Code Playgroud)
  • conv(flag, 2, 10) 将标志字符串从二进制转换为十进制.
  • 1 << 3 将1位3个二进制位移到左侧
  • |执行此二进制OR,以设置该位.此算术运算会自动将十进制字符串强制转换为数字; CAST如果您愿意,可以使用明确的.
  • conv(..., 10, 2) 将十进制字符串转换回二进制字符串
  • lpad(..., 5, '0') 添加前导零以使字符串长5个字符

FIDDLE DEMO

要将该位设置为0,请使用:

set flag = lpad(conv((conv(flag, 2, 10) & ~(1 << 3)), 10, 2), 5, '0')
Run Code Online (Sandbox Code Playgroud)