我在MySQL数据库中有一个带有BIT(64)
行的表,它是64个标志的位掩码。
使用PHP和mysqli,我有一个整数$n
,它在[0, 64)
范围内。我已经编写了一个函数(参见附录I)来设置字节数组的n th 位(即PHP中的字符串)。
当将上述字节数组(字符串)传递给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;
}
答案 0 :(得分:0)
似乎问题源于MySQL不支持字符串的按位比较。当我直接将位掩码作为参数传递时,MySQL会尝试将其解释为整数,例如:试图将bitmask & '123'
解释为bitmask & 123
。我不确定MySQL如何解释像\xFF
或\x00
这样的二进制字符 - 它只是不起作用,可能被解释为0。
我通过在输入中传递位掩码的bin2hex
然后在查询中传递CONV(?, 16, 10)
来解决这个问题。 CONV()将以十进制表示数据,MySQL会将其解释为类似BIGINT的东西,可以成功地与BIT(64)行进行逐位比较。