我打算在MySQL表列中存储一个256位长的二进制值。
我应该使用哪种列类型(blob?)才能对其进行位运算(最好提供AND的示例)。
我打算在MySQL表列中存储一个256位长的二进制值。
我应该使用哪种列类型(blob?)才能对其进行位运算(最好提供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 位)。
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);
-- 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()
来显示二进制。0xFFFFFFFFFFFFFFFF0000000000000000
:update t set a = a & 0xFFFFFFFF,
b = b & 0xFFFFFFFF,
c = c & 0x00000000,
d = d & 0x00000000;
看起来blob可以通过以下位运算查询:
select id,bin(label & b'01000000010000001000000000000000000') from projects;
bin(label & b'01..00')
是否按预期工作?对我来说,它不起作用?!?总是返回0... - Sylvain LerouxBIGINT UNSIGNED
。虽然不是非常优雅,但它可以正常工作,并且您将能够访问MySQL按位运算符的“全部功能”,以及各种转换函数(HEX()
,BIN()
)。 - Sylvain Leroux