13

当我在 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在其他语言/数据库中表示?

4

3 回答 3

8

我似乎无法找到它的确切来源,但我记得前一段时间在我认为 MSDN 上读到过这个。这个答案有 Visual Basic 的 boolean 的技术描述true,它也适用于 Access。

如果我没记错的话,那是因为 -1 以二进制表示,每个位都设置为 1 ( 1111 1111),而 +1 仅将最低有效位设置为 1,其余的均为 0 ( 0000 0001)。因为false表示为 0 ( 0000 0000),所以很容易在按位 NOTtruefalse使用按位 NOT 之间进行更改,但是如果true是其他任何东西,按位 NOT 会导致出现 not 的结果false。此外,使用按位与来检查任何真值的真值都可以,而如果为真则0000 0001不会。

于 2013-06-28T15:24:21.830 回答
4

对于“为什么会这样”,我不知道比戴尔威尔逊在他的回答中已经说过的更好的答案,但是绕过这个问题很简单:

只需习惯WHERE active <> 0在您的查询中使用。

我正在使用 MS Access (where Trueis -1) 和 MS SQL Server (where Trueis 1),并且检查<> 0是始终有效的最简单方法。

于 2013-06-28T15:27:47.413 回答
0

不想开玩笑,但答案是“因为他们就是这样做的”。您关于 1 通常在其他语言中表示正确的说法是不正确的。例如,在 C/C++ 中,false 定义为 ==0,true 定义为 !=0。

这就是为什么你可以说 if(pointer) { ...}

于 2013-06-28T15:12:19.520 回答