2012-01-06 2 views
2

КороткоНевозможно сделать побитовое ИЛИ операцию по MySQL Query INT поля

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

Деталь
У меня есть user_relevance_code поля в моей permissions таблицы (которая типа int(10)), который хранит четыре цифры, которые представляют на долю которых приходятся типы этще разрешение имеет отношение к. Эти четыре цифры содержат 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. Думаю, я делаю это неправильно.

ответ

2

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

user_relevance_code = b'100' | user_relevance_code 

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

user_relevance_code = b'0100' | user_relevance_code 

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

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

, чтобы заставить 10 цифры, чтобы быть 1, оставив остальных троих.

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

+0

Большое спасибо за объяснение, но 'select (b'0100 '| user_relevance_code) из ox_permissions, где user_relevance_code = 1000' также показывает' 1004' и 'update ox_permissions set user_relevance_code = (b'1000' | user_relevance_code), где user_relevance_code = 1000' не выполняет обновление. Не уверен, что я что-то упустил. –

+0

@Sandeepan: 'where user_relevance_code = 1000' использует десятичное значение. Как выглядит ваш стол? И каковы данные на самом деле? Действительно ли 'user_relevance_code' является растровым изображением? –

 Смежные вопросы

  • Нет связанных вопросов^_^