当我在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
(,所以使用按位 NOT 很容易在 true
和 false
之间切换,但如果true
是其他任何东西,按位 NOT 会导致不false
的东西。此外,使用按位 AND 检查任何真值的真实性是可行的,而如果 true 0000 0001
则无效。
我不知道
比戴尔·威尔逊在他的答案中已经说过的更好的答案,但规避这个问题非常简单:
习惯于在查询中使用WHERE active <> 0
。
我正在使用MS Access(True
-1
(和MS SQL Server(True
1
(,检查<> 0
是始终有效的最简单方法。
不是想开玩笑,但答案是"因为他们就是这样做的"。 你说 1 在其他语言中通常意味着 true 是不正确的。 例如,在 C/C++ 中,false 定义为 ==0,true 定义为 !=0。
这就是为什么你可以说if(指针({...}