Почему 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) {...}