SQL (не только mySQL) не подходит для побитовых операций. Если вы сделаете побитовое И, то вы запустите сканирование таблицы, поскольку SQL не сможет использовать какой-либо индекс и должен будет проверять каждую строку по одному за раз.
Было бы лучше, если бы вы создали отдельную таблицу «Категории» и правильно индексированную таблицу «многие ко многим» PostingCategories, чтобы соединить их.
UPDATE
Для людей, которые настаивают на том, что растровые поля не являются проблемой, полезно проверить BIT проблемы Джо Селко . В нижней части статьи приведен список серьезных проблем, вызванных растровыми изображениями.
Что касается комментария о том, что общий оператор не может быть правильным, обратите внимание # 10 - он ломает 1NF, так что да, битовые поля плохие:
- Данные не читаются. ...
- Ограничения b #### для записи ....
- Вы ограничены двумя значениями в каждом поле. Это очень ограничительно; даже половой код ISO не может вписаться в такой столбец ...
- В битовой маске (или в однобитовых флагах) нет временного элемента. Например, флаг «is_legal_adult_flg» ... ДАТА для даты рождения (всего 3 байта) будет содержать полный факт и позволит нам вычислить то, что нам нужно знать; это тоже всегда будет правильно. ...
- Вы обнаружите, что использование флагов приведет к разделению статуса сущности на несколько таблиц ....
- Битовые флаги предполагают избыточность. В системе, которую я только что упомянул, в одной таблице были «is_active_flg» и «is_completed_flg». Завершенный аукцион не активен и наоборот. Это тот же факт в двух флагах. Психология человека (и английский язык) предпочитает слышать утвердительную формулировку (помните старую песню «Да, у нас сегодня нет бананов!»?).
Все эти битовые флаги и проверка последовательности заменяются двумя наборами таблиц переходов между состояниями, один для заявок и один для поставок. Для получения подробной информации об ограничениях перехода состояний. История каждого аукциона теперь находится в одном месте и должна соответствовать бизнес-правилам.
- К тому времени, когда вы разберете столбец битовой маски и выбросите поля, которые вам не нужны, производительность не улучшится по сравнению с более простыми типами данных.
- Группировка и упорядочивание по отдельным полям - настоящая боль. Попытайся.
- Вы должны проиндексировать весь столбец, поэтому, если вам не повезет и вы не получите их в правильном порядке, вы застрянете в сканировании таблицы.
- Поскольку битовая маска не находится в первой нормальной форме (1NF), у вас есть все аномалии, которые мы хотели бы избежать в СУБД.
Я бы также добавил, как насчет NULL? Как насчет отсутствующих флагов? Что если что-то не является ни истинным, ни ложным?
Наконец, что касается утверждения о сжатии, большинство баз данных упаковывают битовые поля в байты и целые числа внутри. В этом случае поле растрового изображения не предлагает никакого сжатия. Другие базы данных (например, PostgreSQL) на самом деле имеют логический тип, который может быть true / false / unknown. Это может занять 1 байт, но это не много памяти и прозрачное сжатие доступно, если таблица становится слишком большой.
На самом деле, если таблица становится большой, проблемы с полями растрового изображения становятся намного серьезнее. Сохранение нескольких МБ в таблице ГБ не принесет пользы, если вы вынуждены использовать сканирование таблицы или потеряли способность группировать