ユーザー権限がビットマスクとして保存されている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 = ????
どうすればよいですか?
権限16を追加するには、次のように言います
UPDATE users SET permission = permission | 16;
ビット単位のOR演算子はビットをオンにします。ビットをオフにするには、オフにするビットの補数を指定してAND演算を使用します。
UPDATE users SET permission = permission & ~16
MySQLのSET を調べる必要があります。それはあなたの人生をずっと楽にするかもしれません。このファンキーなバイナリロジックの代わりに、セットを作成してMySQLにバイナリロジックを実行させることができます。これにより、起こりうるプログラマーエラーやデバッグの問題の数が制限され、コードが読みやすくなります。
しかし、整数の使用に夢中になっている場合は、 ビット関数 を調べてください。たとえば、権限16が設定されているかどうかを確認するには、次のようにします。
SELECT permission<<4 & 1 FROM users
また、権限を追加する場合:
UPDATE users SET permission = permission | 16
これまでに提案されたものよりも一般的な解決策として(ストレージにintを使用する場合):
位置x(右から)のビットを値TARGETで変更する場合:
パーミッション=パーミッション+(TARGET-((permission >> x)%2))<< x