MySQL テーブル列に 256 ビット長のバイナリ値を格納しようとしています。
ビット単位の操作を実行できるように、どの列タイプを使用する必要がありますか (ブロブ?) (AND の例が理想的です)。
MySQL テーブル列に 256 ビット長のバイナリ値を格納しようとしています。
ビット単位の操作を実行できるように、どの列タイプを使用する必要がありますか (ブロブ?) (AND の例が理想的です)。
ドキュメントが明確に述べているように、SQLレベルで256ビット値に対してビット単位の操作を実行する方法を見つけることができないと思います:
MySQL はビット演算に BIGINT (64 ビット) 演算を使用するため、これらの演算子の最大範囲は 64 ビットです。
http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html#operator_bitwise-and
これらの値を保存TINYBLOB
することは可能ですが、私の個人的な好みは単純ですBINARY(32)
(32 バイトのバイナリ文字列-- 256 ビット)。
これを書いているときに、1つのトリックが頭に浮かびました。64 ビット値 ( BIGINT UNSIGNED
) に制限されている場合は、256 ビットを 64 ビットの 4 ワードとして保存しないでください。あまりエレガントではありませんが、うまくいきます。特にここでは、ビット単位の操作のみが必要なので:
ABCD 32 & WXYZ 32 == A 8 & W 8 , B 8 & X 8 , C 8 & Y 8 , D 8 & Z 8
非常に基本的に:
create table t (a bigint unsigned,
b bigint unsigned,
c bigint unsigned,
d bigint unsigned);
挿入中、256 ビット値は 4 ワードに「分割」する必要があります。
-- Here I use hexadecimal notation for conciseness. you may use b'010....000' if you want
insert into t values (0xFFFFFFFF,
0xFFFF0000,
0xFF00FF00,
0xF0F0F0F0);
256 ビット値を簡単に照会できます。
mysql> select CONCAT(LPAD(HEX(a),8,'0'),
LPAD(HEX(b),8,'0'),
LPAD(HEX(c),8,'0'),
LPAD(HEX(d),8,'0')) from t;
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| CONCAT(LPAD(HEX(a),8,'0'),
LPAD(HEX(b),8,'0'),
LPAD(HEX(c),8,'0'),
LPAD(HEX(d),8,'0')) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| FFFFFFFFFFFF0000FF00FF00F0F0F0F0 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
ここでも 16 進数を使用しましたが、̀ を次のように置き換えるHEX()
とBIN()
最後になりましたが、それらに対してバイナリ操作を実行できます。繰り返しますが、オペランドを「分割」するだけです。0xFFFFFFFFFFFFFFFF0000000000000000
テーブル内のすべての値に256 ビットのマスクを適用するとします。
update t set a = a & 0xFFFFFFFF,
b = b & 0xFFFFFFFF,
c = c & 0x00000000,
d = d & 0x00000000;
blob は、ビットごとの and に対して次のようなクエリで動作するように見えます。
select id,bin(label & b'01000000010000001000000000000000000') from projects;