我在 MySQL 数据库中有一个表BIT(64)
,其中一行是 64 个标志的位掩码。
使用 PHP 和 mysqli,我有一个 integer $n
,它在[0, 64)
. 我已经编写了一个函数(参见附录 I)来设置字节数组(即 PHP 中的字符串)的第n位。
当通过上述的字节数组(字符串)到MySQL,似乎bitmask & ?
,其中?
被mysqli::bind_param
编为字节阵列(PARAM类型是"s"
),不将位按预期进行比较。
例如,使用此查询:
SELECT id FROM my_table WHERE (bitmask & ?) > 0
在这张桌子上:
CREATE TABLE my_table (id INT PRIMARY KEY, bitmask BIT(64));
如何解决这个问题?
我想通过一个bin2hex
和UNHEX()
它,但这似乎并没有解决问题。
public static function setNthBit(int $n, int $bytes = 8) : string{
$offset = $n >> 3;
$byteArray = str_repeat("\0", $bytes);
$byteArray{$bytes - 1 - $offset} = chr(1 << ($n & 7));
return $byteArray;
}
看来问题出在 MySQL 不支持字符串的按位比较。当我直接将位掩码作为参数传递时,MySQL 会尝试解释为整数,例如尝试解释bitmask & '123'
为bitmask & 123
. 我不确定 MySQL 是如何解释一堆二进制字符的,比如\xFF
或\x00
——它只是行不通,可能被解释为 0。
我通过bin2hex
在输入和CONV(?, 16, 10)
查询中传递位掩码的来解决这个问题。CONV() 将以十进制表示数据,MySQL 希望将其解释为类似于 BIGINT 的东西,它可以成功地与 BIT(64) 行进行按位比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句