Почему MS-доступ имеет значение boolean true -1, а не 1 или true?

Когда я запускаю запрос в 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 будет работать для boolean.

Почему это и почему -1 является представителем true, когда 1 обычно означает true в других языках/базах данных?

Ответ 1

Я не могу найти точный источник, из которого это происходит, но я помню, как некоторое время назад читал об этом, я думаю, что MSDN. В этом ответе имеется техническое описание булева true Visual Basic, которая также относится к Access.

Если я правильно помню, это потому, что -1 представлен в двоичном формате с каждым битом, установленным в 1 (1111 1111), а +1 имеет только младший значащий бит, установленный в 1 со всеми остальными 0 (0000 0001), Поскольку false представляется как 0 (0000 0000), очень легко изменить между true и false с помощью побитового NOT, но если true было чем-то еще, побитовое NOT привело бы к тому, что isn 't false. Кроме того, использование побитового И для проверки правды на любое правдивое значение будет работать, а если true - 0000 0001, это не будет.

Ответ 2

Я не знаю лучшего ответа на вопрос "Почему это", чем Дейл Уилсон уже сказал в его ответе, но это довольно просто обойти эту проблему:

Просто привык использовать WHERE active <> 0 в ваших запросах.

Я использую MS Access (где True is -1) и MS SQL Server (где True есть 1), и проверка <> 0 - самый простой способ, который всегда работает.

Ответ 3

Не пытайтесь быть смешным, но ответ "потому что так они и сделали". Ваше утверждение, что 1 обычно означает true на других языках, неверно. Например, в C/С++ значение false определяется как == 0, а true - как!= 0.

Вот почему вы можете сказать if (pointer) {...}