为什么 MS 访问布尔值为真 -1 而不是 1 或 true


Why is MS access boolean true -1 rather than 1 or true?

当我在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 发送纯查询时有效,如果仅绑定-10也适用于布尔值。

为什么

会这样,为什么-1代表true,而1通常意味着在其他语言/数据库中true

我似乎找不到确切的来源,但我记得不久前在我认为 MSDN 上读到过这个。这个答案有Visual Basic布尔true的技术描述,也适用于Access。

如果我没记错的话,这是因为 -1 以二进制表示,每个位都设置为 1 (1111 1111 (,而 +1 只有最低有效位设置为 1,其余所有 0 (0000 0001 (。因为false表示为 0 (0000 0000 (,所以使用按位 NOT 很容易在 truefalse 之间切换,但如果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(指针({...}