4

我打算在 MySQL 表列中存储一个 256 位长的二进制值。

我应该使用哪种列类型(blob?),以便我可以对它运行按位运算(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 位)。



在写这篇文章时,我想到了一个技巧。如果我们仅限于 64 位值 ( BIGINT UNSIGNED),为什么不将 256 位存储为 4 个 64 位字。不是很优雅,但这会起作用。尤其是在这里,因为您只需要按位运算:

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                                                                                                                      |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+

我在这里再次使用了十六进制,但是您可以通过将 ̀ 替换HEX()BIN()

最后但并非最不重要的一点是,您可以对它们执行二进制操作。再一次,您只需要“拆分”操作数。假设我想将 256 位掩码0xFFFFFFFFFFFFFFFF0000000000000000应用于表中的所有值:

update t set a = a & 0xFFFFFFFF, 
             b = b & 0xFFFFFFFF, 
             c = c & 0x00000000, 
             d = d & 0x00000000;
于 2013-08-13T22:07:44.470 回答
1

看起来 blob 适用于这样的查询,用于按位和:

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