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

How to check if bit is set in MySQL

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

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

将上述字节数组(字符串)传递给MySQL时,似乎bitmask & ?,其中?mysqli::bind_param编辑为字节数组(param类型为 "s"),未按预期比较位。

例如,使用此查询:

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

在此基础上 table:

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

如何解决这个问题?

我想传递一个 bin2hex and UNHEX() 它,但这似乎不能解决问题。

附录一

public static function setNthBit(int $n, int $bytes = 8) : string{
    $offset = $n >> 3;
    $byteArray = str_repeat("[=13=]", $bytes);
    $byteArray{$bytes - 1 - $offset} = chr(1 << ($n & 7));
    return $byteArray;
}

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

我通过在查询中传递 bin2hex of the bitmask in the input and then CONV(?, 16, 10) 解决了这个问题。 CONV() 将以十进制表示数据,MySQL 将解释为类似 BIGINT 的东西,它可以成功地与 BIT(64) 行进行按位比较。