更新整数列中的特定位

时间:2012-10-17 06:54:49

标签: mysql bitmask

我有一个mysql表,其中用户权限存储为位掩码:

|user   | permissions |
| Admin | 31          |
| User  | 13          |

           16 8  4  2  1
Admin ->   1  1  1  1  1  -> 16 + 8 + 4 + 2 + 1 -> 31
User  ->   0  1  1  0  1  ->  8 + 4 + 1 -> 13

现在我想为每个拥有sql查询的用户添加权限。 让我们说我想为每个人添加权限16而不需要修改另一个位。

 UPDATE users SET permission = ????

我该怎么做?

3 个答案:

答案 0 :(得分:32)

要添加权限16,您只需说

UPDATE users SET permission = permission | 16;

按位OR运算符将打开位。要关闭它们,请使用AND操作和要关闭的位的补码:

UPDATE users SET permission = permission & ~16

答案 1 :(得分:3)

你应该研究MySQL's SET。它可能会让你的生活更轻松。您可以创建一个集合,让MySQL为您执行二进制逻辑,而不是这个时髦的二进制逻辑。这将限制可能的程序员错误数量,调试问题,并使您的代码更具可读性。

但是如果你已经开始使用整数,请查看Bit Functions。例如,要查看是否设置了权限16:

SELECT permission<<4 & 1 FROM users

如果你想添加权限:

UPDATE users SET permission = permission | 16

答案 2 :(得分:0)

作为比目前建议的更通用的解决方案(如果你想使用int进行存储):

如果要修改位置x(从右侧)的位值TARGET:

permission = permission +(TARGET - ((权限&gt;&gt; x)%2))&lt;&lt; X

相关问题