当我在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
?
答案 0 :(得分:7)
我似乎无法找到它的确切来源,但我记得刚才读到这篇关于我认为MSDN。这个answer有一个技术描述Visual Basic的布尔true
,它也适用于Access。
如果我没记错的话,那是因为-1以二进制表示,每个位设置为1(1111 1111
),而+1只将最低有效位设置为1,其余所有位都为0({{ 1}})。由于0000 0001
表示为0(false
),因此使用按位NOT非常容易在0000 0000
和true
之间进行更改,但如果false
是其他内容,按位NOT会导致某些不是true
的东西。此外,使用按位AND来检查任何真值上的真值都可行,而如果真为false
则不会。
答案 1 :(得分:4)
我不知道“为什么会这样”比Dale Wilson在his answer已经说过更好的答案,但是要避免这个问题很简单:
您可以习惯在查询中使用WHERE active <> 0
。
我正在使用MS Access(其中True
是-1
)和MS SQL Server(其中True
是1
)并且检查<> 0
是最简单的方法。
答案 2 :(得分:0)
不要试图变得滑稽,但答案是“因为这就是他们这样做的方式。”您在其他语言中通常表示为1的陈述是不正确的。例如,在C / C ++中,false定义为== 0,而true定义为!= 0。
这就是为什么你可以说if(指针){...}