2

情况

我想在我的 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
4

1 回答 1

3

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

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

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

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

UPDATE table SET options = options & (~((1 << 2) | (1 << 4)))
于 2013-01-10T10:45:14.870 回答