问题 为什么MS访问布尔值为真而不是1或真?


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


2529
2018-06-28 15:08


起源



答案:


我似乎无法找到这个来自的确切来源,但我记得刚才读到这个我认为MSDN。这个 回答 有一个Visual Basic的布尔值的技术说明 true,也适用于Access。

如果我没记错的话,那是因为-1用二进制表示,每一位都设置为1(1111 1111),而+1只将最低有效位设置为1,其余为0(0000 0001)。因为 false 表示为0(0000 0000),它之间很容易改变 true 和 false 使用按位NOT,但如果 true 是别的,一点点不会导致一些不是 false。此外,使用按位AND来检查任何真实值的真值都可行,而如果是真的话 0000 0001 它不会。


7
2018-06-28 15:24



这似乎很合乎逻辑。 Access显然可以应付被喂养 true 在正常的语句中,但绑定查询不能创建问题,除非您提供正确的值。 <>0 似乎是一个很好的解决方法 true 正如@ChristianSpecht所说 - harryg
是的,克里斯蒂安对此是正确的。我想我会回答你问题的第二部分。 - jonhopkins
+1另一种看待它的方式是a 两个补充 只有一位长的有符号整数只能是两个值中的一个:0或-1。 - Gord Thompson


答案:


我似乎无法找到这个来自的确切来源,但我记得刚才读到这个我认为MSDN。这个 回答 有一个Visual Basic的布尔值的技术说明 true,也适用于Access。

如果我没记错的话,那是因为-1用二进制表示,每一位都设置为1(1111 1111),而+1只将最低有效位设置为1,其余为0(0000 0001)。因为 false 表示为0(0000 0000),它之间很容易改变 true 和 false 使用按位NOT,但如果 true 是别的,一点点不会导致一些不是 false。此外,使用按位AND来检查任何真实值的真值都可行,而如果是真的话 0000 0001 它不会。


7
2018-06-28 15:24



这似乎很合乎逻辑。 Access显然可以应付被喂养 true 在正常的语句中,但绑定查询不能创建问题,除非您提供正确的值。 <>0 似乎是一个很好的解决方法 true 正如@ChristianSpecht所说 - harryg
是的,克里斯蒂安对此是正确的。我想我会回答你问题的第二部分。 - jonhopkins
+1另一种看待它的方式是a 两个补充 只有一位长的有符号整数只能是两个值中的一个:0或-1。 - Gord Thompson


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

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

我正在使用MS Access(其中 True 是 -1)和MS SQL Server(其中 True 是 1)和检查 <> 0 是最简单的方法。


4
2018-06-28 15:27



要不就 WHERE Active (我没有用我的SQL Server表测试这个,但是 WHERE ACTIVE 和 WHERE NOT ACTIVE 我会想到这个伎俩 - Scotch
@Scotch是的,刚刚测试过,看起来如果你有一个布尔字段,你可以通过去查询它 SELECT * FROM table WHERE booleanfield 这会给你所有的行 booleanfield = true。 - harryg


不是试图变得滑稽,但答案是“因为这就是他们这样做的方式。”您在其他语言中通常意味着1的陈述是不正确的。例如,在C / C ++中,false定义为== 0,而true定义为!= 0。

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


0
2018-06-28 15:12



很公平但是 1!=0 所以一定要回归真实。在我的问题中并非如此 - 没有给出结果,无论是真还是假。基本上1!=真或假 - harryg
经验法则:测试布尔值,不要比较它们。例如,不要说if(testFunction()== true),只说if(testFunction())当你试图模拟独占或(if(function1()!= function2())时这会变得混乱安全并且正确的方法是稍微冗长:如果function1()then!function2()else function2()保证调用每个函数一次并给你独占或结果。 - Dale Wilson