我认为您无法找到某种方法在 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;