Содержание
Битовые операции в 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
Методы чтения и записи нескольких цифр в одну
статья ещё в разработке