ric*_*ich 3 mysql blob bit-manipulation
我打算在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位).
在写这篇文章时,我想到了一个技巧.如果我们被限制为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);
Run Code Online (Sandbox Code Playgroud)
插入时,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);
Run Code Online (Sandbox Code Playgroud)
您可以轻松查询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 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
我在这里再次使用十六进制,但你可以通过替换显示为二进制HEX()的BIN()
最后但并非最不重要的是,您可以对它们执行二进制操作.再一次,你只需要"拆分"操作数.假设我想将256位掩码0xFFFFFFFFFFFFFFFF0000000000000000应用于表中的所有值:
update t set a = a & 0xFFFFFFFF,
b = b & 0xFFFFFFFF,
c = c & 0x00000000,
d = d & 0x00000000;
Run Code Online (Sandbox Code Playgroud)