Обновление определенного бита в целочисленном столбце
У меня есть таблица 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 = ????
Как это сделать?
Ответы
Ответ 1
Чтобы добавить разрешение 16, вы просто скажете
UPDATE users SET permission = permission | 16;
Побитовый оператор OR включит бит. Чтобы отключить их, используйте операцию И с дополнением к бит, который вы хотите отключить:
UPDATE users SET permission = permission & ~16
Ответ 2
Вы должны заглянуть в MySQL SET. Это может сделать вашу жизнь намного легче. Вместо этой фанковой бинарной логики вы можете просто создать набор и позволить MySQL выполнять двоичную логику для вас. Это ограничит количество возможных ошибок программиста, проблемы отладки и сделает ваш код более читаемым.
Но если вы настроены на использование целого числа, загляните в Функции бит. Например, чтобы узнать, установлено ли разрешение 16:
SELECT permission<<4 & 1 FROM users
И если вы хотите добавить разрешение:
UPDATE users SET permission = permission | 16
Ответ 3
Как более общее решение, чем предлагаемые до сих пор (если вы хотите использовать int для хранения):
Если вы хотите изменить бит в позиции x (справа) со значением TARGET:
разрешение = разрешение + (TARGET - ((разрешение → x)% 2)) < х