У меня есть поле BLOB в базе данных MySQL, которое содержит семибитовое двоичное поле — по сути, один бит для каждого дня недели, начиная с воскресенья с правого бита.
У меня есть две записи, на одном двоичное поле (называемое Flags) установлено на 0101000, а на другое — 0000010. Я использую программное обеспечение Querious на Mac для работы с базой данных, и это показывает, что поле содержит двоичные данные и подтверждает выше записи.
Однако, когда я запускаю оператор SELECT, он включает флаги & 8 = 8 в операторе WHERE возвращаются обе записи, но я считаю, что должна быть только первая.
Код PHP с использованием bindec ($ data-> flags) & 8 правильно отмечает только первую запись как имеющую 4-й бит (то есть значение 8).
Может кто-нибудь посоветовать, что я делаю неправильно с оператором MySQL — я смотрю на это уже более 36 часов и просто не могу это увидеть.
Кажется, работает хорошо здесь, здесь (на v5.7.13)
mysql> create table z (x bit(7));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into z (x) values (0b0101000), (0b000010);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select cast(x & 8 as unsigned) from z;
+-------------------------+
| cast(x & 8 as unsigned) |
+-------------------------+
| 8 |
| 0 |
+-------------------------+
2 rows in set (0.00 sec)
mysql> select x, cast(x as unsigned) from z where x & 8;
+------+---------------------+
| x | cast(x as unsigned) |
+------+---------------------+
| ( | 40 |
+------+---------------------+
1 row in set (0.00 sec)
Вы должны показать свой фактический запрос.
Других решений пока нет …