2016-08-19 2 views
1

У меня есть поле BLOB в базе данных MySQL, содержащее семибитное двоичное поле - по существу, по одному бит для каждого дня недели, начиная с воскресенья с правым боком.MySQL побитовое выражение WHERE, возвращающее нечетные результаты

У меня есть две записи, на одном двоичном поле (называемом флаги) установлено значение 0101000, а другое - на 0000010. Я использую Querious для Mac для работы с базой данных, и это показывает, что поле содержит двоичный код данных и подтверждает указанные выше записи.

Однако, когда я выдаю инструкцию SELECT, которая включает в себя флаги & 8 = 8 в инструкции WHERE, возвращаются обе записи, но я считаю, что только первое должно быть.

PHP-код с использованием привязки bindec ($ data->) & 8 правильно только отмечает первую запись как имеющую 4-й бит (то есть значение 8).

Может кто-нибудь посоветует, что я делаю неправильно с оператором MySQL - я смотрел на это более 36 часов и просто не вижу его.

ответ

2

Кажется работать нормально здесь здесь (на 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) 

Вы должны показать свой фактический запрос.

+0

спасибо - фактический запрос является частью гораздо более крупной таблицы, но я разделил его на простое, что вызывает проблему. Может быть, я храню в BLOB, а не немного (7)? Im использует миграции Laravel 5.2 для создания базы данных, которая устанавливает поля BIT как BLOB. –

+0

возможно, да, поскольку blobs - это просто последовательности байтов. он будет обрабатываться как строковая операция в некотором смысле, причем каждый байт в двух значениях сравнивается параллельно. Когда я переделываю выше с полями blob, я не получаю никаких строк, возвращенных вообще. –

Смежные вопросы