25

我有一个 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 = ????

我该怎么做呢?

4

2 回答 2

49

要添加权限 16,您只需说

UPDATE users SET permission = permission | 16;

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

UPDATE users SET permission = permission & ~16
于 2012-10-17T07:06:47.867 回答
4

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

但是,如果您对使用整数一无所知,请查看Bit Functions。例如,查看是否设置了权限 16:

SELECT permission<<4 & 1 FROM users

如果你想添加权限:

UPDATE users SET permission = permission | 16
于 2012-10-17T07:05:37.213 回答