web-dev-qa-db-ja.com

整数列の特定のビットを更新します

ユーザー権限がビットマスクとして保存されている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 = ????

どうすればよいですか?

21

権限16を追加するには、次のように言います

UPDATE users SET permission = permission | 16;

ビット単位のOR演算子はビットをオンにします。ビットをオフにするには、オフにするビットの補数を指定してAND演算を使用します。

UPDATE users SET permission = permission & ~16
39
Ian Clelland

MySQLのSET を調べる必要があります。それはあなたの人生をずっと楽にするかもしれません。このファンキーなバイナリロジックの代わりに、セットを作成してMySQLにバイナリロジックを実行させることができます。これにより、起こりうるプログラマーエラーやデバッグの問題の数が制限され、コードが読みやすくなります。

しかし、整数の使用に夢中になっている場合は、 ビット関数 を調べてください。たとえば、権限16が設定されているかどうかを確認するには、次のようにします。

SELECT permission<<4 & 1 FROM users

また、権限を追加する場合:

UPDATE users SET permission = permission | 16
4
cegfault

これまでに提案されたものよりも一般的な解決策として(ストレージにintを使用する場合):

位置x(右から)のビットを値TARGETで変更する場合:

パーミッション=パーミッション+(TARGET-((permission >> x)%2))<< x

0
Dukeling