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

时间:2013-06-28 15:08:27

标签: php ms-access pdo

当我在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代表true1在其他语言/数据库中通常意味着true

3 个答案:

答案 0 :(得分:7)

我似乎无法找到它的确切来源,但我记得刚才读到这篇关于我认为MSDN。这个answer有一个技术描述Visual Basic的布尔true,它也适用于Access。

如果我没记错的话,那是因为-1以二进制表示,每个位设置为1(1111 1111),而+1只将最低有效位设置为1,其余所有位都为0({{ 1}})。由于0000 0001表示为0(false),因此使用按位NOT非常容易在0000 0000true之间进行更改,但如果false是其他内容,按位NOT会导致某些不是true的东西。此外,使用按位AND来检查任何真值上的真值都可行,而如果真为false则不会。

答案 1 :(得分:4)

我不知道“为什么会这样”比Dale Wilson在his answer已经说过更好的答案,但是要避免这个问题很简单:

您可以习惯在查询中使用WHERE active <> 0

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

答案 2 :(得分:0)

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

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