我打算在mysql表列中存储一个256位长的二进制值。
我应该使用哪种列类型(blob?)这样我就可以对它运行按位操作(和的示例将是理想的)。

最佳答案

我不认为你能找到在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位字。不是很优雅,但那会有用的。尤其是在这里,因为您只需要按位操作:
abcd32&wxyz32==a8&w8、b8&x8、c8&y8、d8&z8
基本上:

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;

10-06 16:00