Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 位标志处于状态。查找一个标志=0的状态_Php_Mysql_Bit Manipulation - Fatal编程技术网

Php 位标志处于状态。查找一个标志=0的状态

Php 位标志处于状态。查找一个标志=0的状态,php,mysql,bit-manipulation,Php,Mysql,Bit Manipulation,假设状态中有三位标志,作为整数存储在mysql中 Approved Has Result Finished 0|1 0|1 0|1 现在我想找到状态为:Finished=1、Has Result=1和Approved=0的行 然后,数据: 0 "000" 1 "001" 3 "011" 7 "111" 应该产生 false false true false 我可以做类似的事情吗?(在mysql中) 不太清楚如何查询“Approved=0”。

假设状态中有三位标志,作为整数存储在mysql中

Approved    Has Result    Finished
0|1         0|1           0|1
现在我想找到状态为:Finished=1、Has Result=1和Approved=0的行

然后,数据:

0 "000"
1 "001"
3 "011"
7 "111"
应该产生

false
false
true
false
我可以做类似的事情吗?(在mysql中)

不太清楚如何查询“Approved=0”。

或者我应该完全放弃使用位标志,并将它们拆分为单独的列吗


使用位标志的原因部分是为了mysql的性能。

当我开始编程时,我喜欢使用2的幂作为标志,因为缺少布尔值或位类型:

const FINISHED = 1;
const HAS_RESULT = 2;
const APPROVED = 4;
然后您可以这样检查:

$status = 5; // 101
if ($status & FINISHED) { 
    /*...*/ 
}
编辑

让我进一步说明:

不太清楚如何查询“Approved=0”。

或者我应该完全放弃使用位标志,并将它们拆分为单独的列吗

使用位标志的原因部分是为了mysql的性能

问题是,您没有使用位标志。您使用的字符串“模拟”了按位标志,这使得实际执行正确的标志检查有点困难。您必须将其转换为按位表示,然后进行检查


将标志值存储为整数,并声明将用于执行检查的标志标识符。TINYINT应该提供7个可能的标志(减去用于符号的最高有效位)和8个可能的无符号TINYINT标志。

我开始编程时喜欢做的一件事是在缺少布尔值或位类型的情况下使用2的幂作为标志:

const FINISHED = 1;
const HAS_RESULT = 2;
const APPROVED = 4;
然后您可以这样检查:

$status = 5; // 101
if ($status & FINISHED) { 
    /*...*/ 
}
编辑

让我进一步说明:

不太清楚如何查询“Approved=0”。

或者我应该完全放弃使用位标志,并将它们拆分为单独的列吗

使用位标志的原因部分是为了mysql的性能

问题是,您没有使用位标志。您使用的字符串“模拟”了按位标志,这使得实际执行正确的标志检查有点困难。您必须将其转换为按位表示,然后进行检查


将标志值存储为整数,并声明将用于执行检查的标志标识符。TINYINT应提供7个可能的标志(减去用于符号的最高有效位)和8个可能的无符号TINYINT标志。

使用整数而不是二进制文本。使用
3
代替
011

要获取已批准的行,请执行以下操作:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 4)
或已批准和完成的行:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 5)
或已完成但未接受:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 1)
AND
    (`status` ^ 4)

“Finished=1,Has Result=1,Approved=0”可以像
status
=3一样简单。

使用整数而不是二进制文本。使用
3
代替
011

要获取已批准的行,请执行以下操作:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 4)
或已批准和完成的行:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 5)
或已完成但未接受:

SELECT
    *
FROM
    `foo`
WHERE
    (`status` & 1)
AND
    (`status` ^ 4)

“Finished=1,Has Result=1,Approved=0”可以简单到
状态
=3。

您阅读过文档吗?您真的应该将它们存储在不同的列中,以便进行正确的查询。您有3个空格分隔的状态,每个状态在一个字段中保留3个二进制标志?我同意@Jessica;用健全的RDBMS实践来制造恐怖并重写。文档,到底是为了什么?我读过位运算符,是的。我可能需要在不同的栏中存储,是的。澄清一下:存储类型是整数,空格只是为了可读性。那么
其中status=3
有什么问题吗?您阅读过文档吗?您真的应该将它们存储在不同的列中,以便进行正确的查询。您有3个空格分隔的状态,每个状态在一个字段中有3个二进制标志?我同意@Jessica;用健全的RDBMS实践来制造恐怖并重写。文档,到底是为了什么?我读过位运算符,是的。我可能需要在不同的栏中存储,是的。澄清一下:存储类型是整数,空格只是为了可读性。那么状态为3的
有什么问题吗?编辑了这个问题,说明我实际上使用整数。但是,假设我想要未经批准但已完成的行。@jborch您应该能够使用按位异或(
^
)来执行此操作。请参阅我的编辑。编辑了问题,说明我实际使用整数。但是,假设我想要未经批准但已完成的行。@jborch您应该能够使用按位异或(
^
)来执行此操作。请参阅我的编辑。