Содержание

Битовые операции в MySQL

В данной статейке, как всегда для себя любимого я постарался описать разные возможные проработки с битовыми операциями. Как программист старой школы, мне они намного больше нравятся чем например enum, хотя не спорю все новые MySQL админки имеют удобные редакторы enum полей.

Битовые флаги, от простого к сложному

Итак приступим. Флаги у нас будут следующие (записано в HEX)

const USER_READ = $00000001 
const USER_WRITE = $00000002
const GROUP_READ = $00000010
const GROUP_WRITE = $00000020
const ANY_READ = $00000100
const ANY_WRITE = $00000200

Простая работа (чтение, запись, установить, снять)

Выбрать те записи у которых есть флаг GROUP_READ

SELECT * FROM files WHERE flags & GROUP_READ = GROUP_READ

Выбрать те записи у которых нету флага GROUP_READ

SELECT * FROM files WHERE flags & GROUP_READ <> GROUP_READ

Выбрать те записи у которых есть USER_READ и GROUP_READ одновременно

SELECT * FROM files WHERE flags & (USER_READ+GROUP_READ) = (USER_READ+GROUP_READ)

Выбрать те записи у которых есть USER_READ или GROUP_READ (Если будет хоть одно совпадение, то результат будет маска совпадения)

SELECT * FROM files WHERE flags & (USER_READ+GROUP_READ) <> 0

Добавить флаг ANY_READ где id = 5

UPDATE files SET flags = flags | ANY_READ WHERE id = 5

Удалить флаг ANY_READ где id = 5

UPDATE files SET flags = flags &~ ANY_READ WHERE id = 5

Добавить флаг ANY_READ и ANY_WRITE где id = 5

UPDATE files SET flags = flags | (ANY_READ+ANY_WRITE) WHERE id = 5

Удалить флаг ANY_READ и ANY_WRITE где id = 5

UPDATE files SET flags = flags &~ (ANY_READ+ANY_WRITE) WHERE id = 5

Методы чтения и записи нескольких цифр в одну

FIXME статья ещё в разработке