【问题标题】:update specific bit in integer column更新整数列中的特定位
【发布时间】:2012-10-17 06:54:49
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 那么你能显示你的更新数据吗?
  • User -> 1 1 1 0 1 -> 29
  • @AnandPhadke - 该链接用于存储许多字节的数据类型;这需要比这个问题更复杂的解决方案。

标签: mysql bitmask


【解决方案1】:

要添加权限 16,您只需说

UPDATE users SET permission = permission | 16;

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

UPDATE users SET permission = permission & ~16

【讨论】:

  • 推广到多个位:假设要同时设置值为 16 和 2 的位。即二进制值b'10010'。所以第一个 sn-p 将以:= permission | b'10010'; 结尾,对应的 clear 将以:= permission & ~b'10010'; 结尾。
  • ... 或者如果您更喜欢写入位的十进制值,可以通过这种方式执行多个位:设置多个位: ... = permission | (16+2);, To清除多个位: ... = permission & ~(16+2);.
【解决方案2】:

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

但是,如果您不喜欢使用整数,请查看Bit Functions。例如,查看是否设置了权限 16:

SELECT permission<<4 & 1 FROM users

如果你想添加权限:

UPDATE users SET permission = permission | 16

【讨论】:

  • 第一个 sn-p 错误。应该是permission&gt;&gt;4,向下移动到 1 的数字。移位的替代方法是直接使用二进制文字。 SELECT permission &amp; b'10000' ... 测试值为 16 的位。或使用 SELECT permission &amp; 16 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
相关资源
最近更新 更多