如何检查MySQL中是否设置了位

时间:2017-05-19 15:10:36

标签: php mysql mysqli bit-manipulation pocketmine

我在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));

如何解决这个问题?

我想过传递一个bin2hexUNHEX(),但这似乎无法解决问题。

附录I

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;
}

1 个答案:

答案 0 :(得分:0)

似乎问题源于MySQL不支持字符串的按位比较。当我直接将位掩码作为参数传递时,MySQL会尝试将其解释为整数,例如:试图将bitmask & '123'解释为bitmask & 123。我不确定MySQL如何解释像\xFF\x00这样的二进制字符 - 它只是不起作用,可能被解释为0。

我通过在输入中传递位掩码的bin2hex然后在查询中传递CONV(?, 16, 10)来解决这个问题。 CONV()将以十进制表示数据,MySQL会将其解释为类似BIGINT的东西,可以成功地与BIT(64)行进行逐位比较。