我打算在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;