Невозможно выполнить побитовую операцию ИЛИ над запросом int field mysql - PullRequest
2 голосов
/ 06 января 2012

Вкратце

Предположим, что поле типа int в моей таблице содержит любое двоичное четырехзначное число (комбинация 0 и 1, например 1010, 0110 и т. Д.).Как выборочно обновить только некоторые из этих цифр, не изменяя другие.

Подробности
У меня есть поле user_relevance_code в моей таблице permissions (типа *)1013 *), в котором хранятся четыре цифры, представляющие, к каким типам учетных записей относится данное разрешение.Эти четыре цифры хранят 1 или 0 каждая, означая, имеет ли это значение.Слева направо сохраняется отношение к этим типам счетов - Manager, Publisher, Advertiser, Developer.Таким образом, значение 0110, хранящееся в этом поле, будет означать, что оно относится к менеджерам, издателям и не относится к рекламодателям.

Теперь предположим, что в любой момент мне нужно пометить некоторые из этих разрешений как относящиеся к менеджерам или сделать их релевантными для рекламодателей и издателей, и в то же время сделать их не относящимися к менеджерам и всемтакие случайные операции.Во всех таких случаях мне нужно не трогать другие цифры.Это означает, что если мне нужно обновить только цифру релевантности менеджера, я не должен касаться цифр издателя и рекламодателя.

Проблема
Очевидно, что мне нужно сделать двоичный ИЛИкода, который мне нужно применить с текущим значением user_relevance_code и сохранить его, но это не работает для меня.

Для операции создания некоторых разрешений, относящихся к издателям, я пробовал этот запрос -

update permissions set user_relevance_code = (0100 | user_relevance_code) where <condition to update some permissions>

Но это не дало желаемых результатов.Те записи, которые имели 1000 ранее, были обновлены до 1004, где я хотел, чтобы они стали 1100 (обновите только 2-ю цифру до 1 и оставьте другие как есть).

Я такжепопытался изменить тип этого поля на binary.Я думаю, что я делаю это неправильно.

1 Ответ

2 голосов
/ 06 января 2012

В MySQL 0100 - это десятичное число, а не число с основанием 2, поэтому вы получаете 1004 за 100 | 1000.Если вы хотите убедиться в том, что установлен бит 2 2 , вам нужно:

user_relevance_code = b'100' | user_relevance_code

или, если вы предпочитаете указывать все четыре бита для ясности (хорошая идея, когда битwrangling):

user_relevance_code = b'0100' | user_relevance_code

Все вышеперечисленное предполагает, что вы действительно храните растровые изображения в своих user_relevance_code, а не в числах base-10 (таких как 1000, 1101, 110, ...), которые простослучайно выглядит как двоичный файл.Если значения на самом деле являются десятичными, то битовые операции - не лучший инструмент для работы, и вы, вероятно, захотите использовать что-то неприятное, например:

user_relevance_code = (user_relevance_code div 1000) * 1000 + 100 + (user_relevance_code % 100)

, чтобы заставить 10 2 цифра должна быть 1, а остальные три оставлены в покое.

Я должен сказать, что спорные биты на самом деле не являются естественной вещью в SQL.Отдельная таблица ассоциаций (пользователь, разрешение) будет намного более естественной.Затем вы будете манипулировать наборами разрешений с помощью простых объединений, вставок и удалений.Конечно, если у вас нет контроля над схемой, вы должны использовать то, что у вас есть.

...