2

状況

PHP/MySQL アプリケーション内の特定のステータス フィールドを変換して、いつでも複数のフィールドを処理したいと考えています。例として、現在の ENUM フィールドを以下に示します。

STATUS_ACTIVE
STATUS_FROZEN
STATUS_PENDING
STATUS_FLAGGED
STATUS_DELETED

現在、一度に 1 つのみサポートされます。ただし、セットをバイナリに変換すると、文字列のセットになります。

1     STATUS_ACTIVE
10    STATUS_FROZEN
100   STATUS_PENDING
1000  STATUS_FLAGGED
10000 STATUS_DELETED

さて、PHPの賢明なフィルタリングに関しては、問題はありません。ただし、これにより、大きな (そして不必要な) オーバーヘッドが発生します。エントリが最終的に次のようになる可能性が非常に高い

10010
01110
etc.

質問

私はいくつか掘り下げましたが、私が見つけた最良の情報は、実際には(皮肉なことに)ここでスタックオーバーフローにありました。誰かがそこで使用されている実際の構文を説明するか、正しい 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 に答える