Поле типа BIT

Постараюсь быть конкретным и понятным.
В mysql поле типа bit(2) используется как флаг, т.е. например первый бит — получатель удалил сообщение, второй бит отправитель удалил сообщение, эдакая двойная булевая, вопрос, как изменять отдельно каждый бит, не извлекая предыдущего?
Где-то читал про это, но найти не могу.
Копать в сторону смещений?
  • Вопрос задан
  • 6155 просмотров
Пригласить эксперта
Ответы на вопрос 3
iSage
@iSage
выставить крайний правый бит в 1: update bitset set data=data | 1
выставить крайний правый бит в 0: update bitset set data=data &~ 1
остальные биты так же (2, 4, 8, 16 ...)
Ответ написан
eternals
@eternals
habrahabr.ru/blogs/webdev/41458/
Там 2 ссылки сверху, ну и по топикам автора, плюс в комментах.

К этому ещё dev.mysql.com/doc/refman/5.0/en/bit-functions.html
Плюс не забывать, про особенность работы BIT в mysql, проблемы переносимости и т.д.

Если Вы говорите о «отдельно каждый бит, не извлекая предыдущего», то биты всё равно физически извлекаются, прежде чем ваш новый бит будет записан. Поэтому речь только о sql-записи изменения бита. Отсюда бинарные операции подходят.

P.S.: Попутно отмечу, что поиск на уёбищном dev.mysql.com опять не работает. Ну это так, для любителей говна всякого, чтобы место знали.
Ответ написан
Комментировать
@Jazzist
Использую поле integer через слой. NULL понимается как FALSE, единичка 1 — TRUE.

В итоге:
1. Кроссбазно. В любой момент можно переезжать от SQLite и MySQL до PostgreSQL и Oracle, а также экзотические, и даже nosql базы. Все, что поддерживает слой. Если не поддерживает — просто написать новый драйвер для слоя.
2. Не заметно каких-то существенных изменений в производительности и ресурсах. Честное слово, не заметно!
3. Удобно для использования, удобно для программирования, очень удобно для стандартизации.
4. В любой момент можно расширить количество состояний сущности. Про запас имеются 4 миллиарда вариантов…
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы