Php 为什么MS access布尔值为true-1而不是1或true?

Php 为什么MS access布尔值为true-1而不是1或true?,php,ms-access,pdo,Php,Ms Access,Pdo,当我在MS Access中运行查询时,我可以愉快地使用如下查询: SELECT clients.* FROM clients WHERE active=True; 或 但不是 SELECT clients.* FROM clients WHERE active=1; 此外,假设我想使用PDO查询数据库,我可能会使用一条准备好的语句: $db->prepare('SELECT clients.* FROM clients WHERE active=:isactive;'); $db-&g

当我在MS Access中运行查询时,我可以愉快地使用如下查询:

SELECT clients.* FROM clients WHERE active=True;

但不是

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
时?

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


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

我似乎找不到它的确切来源,但我记得不久前在我想MSDN上读到过这篇文章。这是对Visual Basic的布尔值
true
的技术描述,它也适用于Access


如果我没记错的话,那是因为-1用二进制表示,每个位都设置为1(
1111111
),而+1只将最低有效位设置为1,其余为0(
0000 0001
)。因为
false
表示为0(
0000
),所以很容易使用位NOT在
true
false
之间进行切换,但是如果
true
是其他值,则位NOT将导致非
false
。此外,使用按位AND检查任何真值的真值都可以,而如果真值为
0000 0001
则不行。

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

只要习惯在查询中使用
活动的0


我使用的是MS Access(其中
True
-1
)和MS SQL Server(其中
True
1
),检查
0
是最简单的方法=0因此肯定会返回true。我的问题并非如此——没有给出结果,无论是真是假。基本上是1!=正确或错误经验法则:测试布尔值,不要比较它们。例如,不要说if(testFunction()==true),只要说if(testFunction())当您尝试模拟排他时,这会变得混乱,或者(if(function1()!=function2())安全而正确的方法会更加详细:if function1()然后!function2()else function2()保证调用每个函数一次,并为您提供结果的异或。这似乎非常合乎逻辑。显然,Access可以处理在正常语句中输入
true
,但绑定查询不会因此产生问题,除非您为其输入正确的值。
0
似乎是
true
的一个很好的解决方法@Christian Pecht提到是的,Christian是正确的。我只是想回答你问题的第二部分。+1另一种看待它的方式是,只有一位长的有符号整数只能是两个值中的一个:0或-1。或者只
在活动的地方
(我还没有用我的SQL Server表测试过这一点,但是
WHERE-ACTIVE
WHERE-NOT-ACTIVE
会起到我想要的作用think@Scotch是的,刚刚测试过,如果您有一个布尔字段,您可以通过从booleanfield
所在的表中选择*来查询它,这将为您提供
booleanfield=正确
$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