====== Битовые операции в 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 статья ещё в разработке