当我在MS Access中运行查询时,我可以愉快地使用这样的查询:
SELECT clients.* FROM clients WHERE active=True;
要么
SELECT clients.* FROM clients WHERE active=-1;
但不是
SELECT clients.* FROM clients WHERE active=1;
另外,假设我想使用PDO查询数据库,我可能会使用预准备语句:
$db->prepare('SELECT clients.* FROM clients WHERE active=:isactive;');
$db->bindValue(':isactive', True); //Does not work
$db->bindValue(':isactive', 1); //Does not work
$db->bindValue(':isactive', -1); //Does work
即便如此 true
在向Access发送普通查询时有效,如果仅绑定 -1
要么 0
将适用于布尔值。
为什么这是为什么呢? -1
代表人物 true
什么时候 1
通常意味着 true
在其他语言/数据库?
我似乎无法找到这个来自的确切来源,但我记得刚才读到这个我认为MSDN。这个 回答 有一个Visual Basic的布尔值的技术说明 true
,也适用于Access。
如果我没记错的话,那是因为-1用二进制表示,每一位都设置为1(1111 1111
),而+1只将最低有效位设置为1,其余为0(0000 0001
)。因为 false
表示为0(0000 0000
),它之间很容易改变 true
和 false
使用按位NOT,但如果 true
是别的,一点点不会导致一些不是 false
。此外,使用按位AND来检查任何真实值的真值都可行,而如果是真的话 0000 0001
它不会。
我似乎无法找到这个来自的确切来源,但我记得刚才读到这个我认为MSDN。这个 回答 有一个Visual Basic的布尔值的技术说明 true
,也适用于Access。
如果我没记错的话,那是因为-1用二进制表示,每一位都设置为1(1111 1111
),而+1只将最低有效位设置为1,其余为0(0000 0001
)。因为 false
表示为0(0000 0000
),它之间很容易改变 true
和 false
使用按位NOT,但如果 true
是别的,一点点不会导致一些不是 false
。此外,使用按位AND来检查任何真实值的真值都可行,而如果是真的话 0000 0001
它不会。
我不知道“为什么会这样”比戴尔威尔逊已经说过更好的答案 他的回答,但绕过这个问题很简单:
只是习惯使用 WHERE active <> 0
在你的查询中。
我正在使用MS Access(其中 True
是 -1
)和MS SQL Server(其中 True
是 1
)和检查 <> 0
是最简单的方法。
不是试图变得滑稽,但答案是“因为这就是他们这样做的方式。”您在其他语言中通常意味着1的陈述是不正确的。例如,在C / C ++中,false定义为== 0,而true定义为!= 0。
这就是为什么你可以说if(指针){...}