0

我在 MySQL 数据库中有一个表BIT(64),其中一行是 64 个标志的位掩码。

使用 PHP 和 mysqli,我有一个整数$n,它在范围内[0, 64)。我已经编写了一个函数(见附录 I)来设置字节数组的第 n(即 PHP 中的字符串)。

将上述字节数组(字符串)传递给 MySQL 时,似乎bitmask & ?, where ?is mysqli::bind_paramed 作为字节数组(参数类型为"s"),并没有按预期比较位。

例如,使用此查询:

SELECT id FROM my_table WHERE (bitmask & ?) > 0

在这张桌子上:

CREATE TABLE my_table (id INT PRIMARY KEY, bitmask BIT(64));

如何解决这个问题?

我想通过 abin2hexUNHEX()它,但这似乎并不能解决问题。

附录一

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

1 回答 1

0

看来问题源于 MySQL 不支持字符串的按位比较。当我直接将位掩码作为参数传递时,MySQL 会尝试解释为整数,例如尝试解释bitmask & '123'bitmask & 123. 我不确定 MySQL 是如何解释一堆二进制字符的,比如\xFFor \x00—— 它只是不起作用,可能解释为 0。

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

于 2017-05-20T08:50:46.873 回答