4

MySQL テーブル列に 256 ビット長のバイナリ値を格納しようとしています。

ビット単位の操作を実行できるように、どの列タイプを使用する必要がありますか (ブロブ?) (AND の例が理想的です)。

4

2 に答える 2

6

ドキュメントが明確に述べているように、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;
于 2013-08-13T22:07:44.470 に答える
1

blob は、ビットごとの and に対して次のようなクエリで動作するように見えます。

select id,bin(label & b'01000000010000001000000000000000000') from projects;
于 2013-08-13T20:08:34.187 に答える