如何检查 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) 行进行按位比较。
我在 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) 行进行按位比较。