【问题标题】:Why is MS access boolean true -1 rather than 1 or true?为什么 MS access boolean true -1 而不是 1 或 true?
【发布时间】:2013-06-26 10:00:30
【问题描述】:

当我在 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

【问题讨论】:

    标签: php ms-access pdo


    【解决方案1】:

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

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

    【讨论】:

    • 这看起来很合乎逻辑。显然,Access 可以处理在正常语句中输入 true 的问题,但绑定查询不会因此产生问题,除非您为其提供正确的值。 @ChristianSpecht 提到,<>0 似乎是 true 的一个很好的解决方法
    • 是的,Christian 是正确的。我只是想我会回答你问题的第二部分。
    • +1 另一种看待它的方式是,只有一位长的 two's complement 有符号整数只能是以下两个值之一:0 或 -1。
    【解决方案2】:

    对于“为什么会这样”,我没有比 Dale Wilson 在his answer 中所说的更好的答案,但绕过这个问题很简单:

    习惯于在查询中使用WHERE active <> 0

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

    【讨论】:

    • 或者只是WHERE Active(我还没有用我的SQL Server表测试过这个,但是WHERE ACTIVEWHERE NOT ACTIVE会做我认为的伎俩
    • @Scotch 是的,刚刚测试过,如果你有一个布尔字段,你可以通过 SELECT * FROM table WHERE booleanfield 来查询它,这将为你提供booleanfield = true 的所有行。
    【解决方案3】:

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

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

    【讨论】:

    • 很公平,但 1!=0 所以肯定会返回 true。在我的问题中情况并非如此-无论真假,都没有给出结果。基本上 1 != true or false
    • 经验法则:测试布尔值,不要比较它们。例如,不要说 if(testFunction() == true),只说 if(testFunction()) 当你试图模拟独占或 (if(function1() != function2()) 时,这会变得混乱正确的方法是稍微冗长一些: if function1() then !function2() else function2() 保证调用每个函数一次并给你结果的异或。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2015-07-17
    • 2013-01-05
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多