2016-08-19 6 views
1

私は、7ビットのバイナリフィールドを含むBLOBフィールドを持っています。つまり、日曜日に右手ビットで始まる週の1ビットです。MySQLは、奇妙な結果を返すWHEREステートメントのビット単位

2つのレコードがあり、2つのフィールド(フラグ)は0101000に設定され、もう1つは0000010に設定されています。私はMac上でQueriousソフトウェアを使用してデータベース作業を行い、フィールドにはバイナリ上記のエントリを確認します。

ただし、WHEREステートメントでフラグ& 8 = 8を含むSELECTステートメントを発行すると、両方のレコードが返されますが、最初のステートメントのみが返されます。

bindec($ data-> flags)& 8を使用するPHPコードでは、最初のレコードが4番目のビット(つまり値8)が設定されているものとして正しくマークされます。

誰かが私がMySQLのステートメントに間違っていることをアドバイスすることができます - 私は36時間以上これを見てきました。

答えて

2

はあなたの実際のクエリを表示する必要があります

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) 

ここで、ここで(v5.7.13上の)罰金に動作するようです。

+0

ありがとうございます - 実際のクエリははるかに大きなテーブルの一部ですが、私はこれを取り除きましたが、これは問題を引き起こしています。それは私がビット(7)ではなくBLOBに格納している可能性がありますか? Imは、Laravel 5.2の移行を使用してBITフィールドをBLOBとして設定するデータベースを作成します。 –

+0

おそらく、はい、ブロブはバイトのシーケンスであるためです。 2つの値の各バイトが並列に比較されるように、文字列演算として扱われます。上記のBLOBフィールドをやり直すと、行が返されません。 –