Mysql二进制搜索

时间:2013-01-10 08:34:05

标签: mysql binary bit-manipulation

场合

我希望将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

1 个答案:

答案 0 :(得分:3)

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

如果您需要设置3位和5位,则应OR使用10100

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

如果您需要清除3位和5位,则应11101011 = NOT(10100)使用UPDATE table SET options = options & (~((1 << 2) | (1 << 4)))

{{1}}
{{1}}