【问题标题】:Mysql binary searchingMysql二分查找
【发布时间】:2012-12-24 14:07:44
【问题描述】:

情况

我想在我的 PHP/MySQL 应用程序中转换某些状态字段,以便随时处理多个。下面以目前的 ENUM 字段为例:

STATUS_ACTIVE
STATUS_FROZEN
STATUS_PENDING
STATUS_FLAGGED
STATUS_DELETED

目前,它一次只支持一个。然而,通过将集合转换为二进制,我最终得到了一组字符串。

1     STATUS_ACTIVE
10    STATUS_FROZEN
100   STATUS_PENDING
1000  STATUS_FLAGGED
10000 STATUS_DELETED

现在,在过滤 PHP 方面,我没有任何问题。但是,这会带来很大的(且不必要的)开销。很可能一个条目最终会成为

10010
01110
etc.

问题

我已经做了一些挖掘,我发现的最好的信息实际上是在 stackoverflow 上(具有讽刺意味)here. 有人可以解释那里使用的实际语法或指向正确的 MySQL 手册页面。

目前还不清楚人们会如何假设这些情况:

Changing only the third bit
Searching for 1 on only the fourth bit
Updating two binary flags at the same time

非常感谢您向正确的方向敲门,感谢您的阅读。

编辑:我已经弄清楚了大部分语法。我现在的问题是:是否可以一次更改多个位而不必重新定义整个事物?

I.e

100 -> 1011
1 -> 101

【问题讨论】:

  • 实验是一切学习之母。我创建了一个测试数据库来玩弄并改组。不过,我仍然有点好奇是否可以在同一个查询中更改两个位。更新问题

标签: mysql binary bit-manipulation


【解决方案1】:

回答您更新的问题。例如我们需要 3 和 5 位。

如果您需要设置 3 位和 5 位,您应该使用OR 您的字段10100

UPDATE table SET options = options | ((1 << 2) | (1 << 4))

如果您需要清除 3 位和 5 位,您应该使用11101011 = NOT(10100)AND 您的字段

UPDATE table SET options = options & (~((1 << 2) | (1 << 4)))

【讨论】:

  • 你一针见血,谢谢你的回复:)
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2015-07-25
  • 1970-01-01
  • 2018-03-27
  • 2018-01-08
相关资源
最近更新 更多