2016-08-19 1 views
1

Ich habe ein BLOB-Feld in einer MySQL-Datenbank, die ein Sieben-Bit-Binärfeld enthält - im Wesentlichen ein Bit für jeden Wochentag, beginnend an einem Sonntag mit dem rechten Bit.MySQL bitweise in WHERE-Anweisung, die ungerade Ergebnisse zurückgibt

Ich habe zwei Datensätze, auf einem der binäre Feld (genannt Flags) ist auf 0101000 festgelegt, während der andere auf 0000010 festgelegt ist. Ich verwende Querious Software auf einem Mac für die Datenbank arbeiten, und das zeigt, dass das Feld binäre enthält Daten und bestätigt die obigen Einträge.

Wenn ich jedoch eine SELECT-Anweisung ausgibt, die Flags & 8 = 8 in der WHERE-Anweisung enthält, werden beide Datensätze zurückgegeben, aber ich glaube, nur die erste sollte sein.

Der PHP-Code mit bindec ($ data-> flags) & 8 markiert nur korrekt den ersten Datensatz, wenn das 4. Bit (d. H. Wert 8) gesetzt ist.

Kann jemand raten, was ich falsch mache mit der MySQL-Anweisung - ich habe das jetzt seit über 36 Stunden gesehen, und sehe es einfach nicht.

Antwort

2

scheint hier in feinen, hier zu arbeiten (auf 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) 

Sie Ihre IST-Abfrage zeigen.

+0

danke - die eigentliche Abfrage ist Teil einer viel größeren Tabelle, aber ich habe es nur auf diese reduziert, die das Problem verursacht. Könnte es sein, dass ich in einem BLOB statt in einem Bit (7) speichere? Ich benutze Laravel 5.2 Migrationen, um die Datenbank zu erstellen, die BIT-Felder als BLOBs einrichtet. –

+0

wahrscheinlich, ja, da Blobs nur Sequenzen von Bytes sind. es wird in gewisser Weise als eine Zeichenfolgeoperation behandelt, wobei jedes Byte in den zwei Werten parallel verglichen wird. Wenn ich das obige mit Blob-Feldern wiederhole, bekomme ich überhaupt keine Zeilen zurück. –

Verwandte Themen