2013-06-28 17 views
11

Kiedy uruchomić kwerendy w MS Access mogę szczęśliwie użyć kwerendy tak:Dlaczego MS ma wartość boolean true -1 zamiast 1 lub true?

SELECT clients.* FROM clients WHERE active=True; 

lub

SELECT clients.* FROM clients WHERE active=-1; 

ale nie

SELECT clients.* FROM clients WHERE active=1; 

Ponadto, mówią, że chcą zapytanie do bazy danych za pomocą PDO Mogę użyć przygotowanej instrukcji:

$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 

Tak więc pomimo, że działa podczas wysyłania zwykłego zapytania do programu Access, jeśli tylko wiązanie będzie miało wartość -1 lub 0, będzie działać dla wartości boolowskiej.

Dlaczego to jest i dlaczego jest -1 przedstawiciel true gdy 1 oznacza zwykle true w innych językach/baz danych?

Odpowiedz

6

I nie wydaje się znaleźć dokładne źródło to jest z, ale pamiętam czytanie o tym jakiś czas temu na myślę MSDN. Ten answer ma opis techniczny Boolean Visual Basic true, który dotyczy również Access.

Jeśli dobrze pamiętam, to dlatego, że -1 jest reprezentowany w formacie binarnym z każdego bitu 1 (1111 1111), natomiast +1 ma tylko najmniej znaczący bit ustawiony na 1, z całą resztą 0 (0000 0001). Ponieważ false jest reprezentowany jako 0 (0000 0000), bardzo łatwo jest zmienić między true i false za pomocą bitowego NOT, ale jeśli true było cokolwiek innego, bitowe NIE spowodowałoby czegoś, co nie jest false. Również użycie bitowego ORAZ w celu sprawdzenia prawdy na temat jakiejkolwiek wartości prawdy zadziała, a jeśli prawdą jest 0000 0001, nie będzie.

+0

To wydaje się bardzo logiczne. Oczywiście Access może poradzić sobie z podawaniem "true" w normalnym komunikacie, ale wiążące zapytania nie mogą tak stworzyć problemu, chyba że podasz mu odpowiednią wartość. '<> 0' wydaje się dobrym obejściem dla' true' jako @ChristianSpecht mentioned – harryg

+0

Tak, Christian ma rację. Po prostu pomyślałem, że odpowiem na drugą część twojego pytania. – jonhopkins

+1

+1 Innym sposobem patrzenia na to jest to, że liczba całkowita (która jest tylko jedna bitowa) może być tylko jedną z dwóch wartości: 0 lub -1. –

0

Nie próbuje być żartobliwy, ale odpowiedź brzmi "ponieważ tak to zrobili." Twoje oświadczenie, że 1 zwykle oznacza prawdziwe w innych językach, jest nieprawidłowe. Na przykład w C/C++, false jest zdefiniowane jako == 0, a prawda jest zdefiniowana jako! = 0.

Dlatego można powiedzieć, że jeśli (wskaźnik) {...}

+0

Wystarczająco sprawiedliwe, ale '1! = 0', więc na pewno powróci true. Tak nie jest w moim pytaniu - nie podano wyników, czy to prawda czy fałsz. Zasadniczo 1! = Prawda lub fałsz – harryg

+0

Zasada kciuka: Sprawdź wartości boolowskie, nie porównuj ich. Na przykład nie mów, jeśli (testFunction() == true), po prostu powiedz, jeśli (testFunction()) To staje się kłopotliwe, gdy próbujesz symulować exclusive lub (if (function1()! = Function2()) i poprawny sposób to zrobić jest nieco bardziej szczegółowy: jeśli function1() then!function2() else funkcja2() gwarantuje wywołanie każdej funkcji raz i daje wyłączność lub wyniki. –

4

Nie znam lepszej odpowiedzi na „Dlaczego jest to” niż Dale Wilson już powiedziane w his answer, ale jest to dość łatwe do obejścia tego problemu:

prostu używałem WHERE active <> 0 w zapytaniach.

Używam MS Access (gdzie True jest -1) i MS SQL Server (gdzie True jest 1) i sprawdzanie <> 0 jest najprostszym sposobem, który zawsze działa.

+1

Lub po prostu "WHERE Active" (nie testowałem tego z moimi tabelami SQL Server, ale "GDZIE AKTYWNE" i "GDZIE NIE AKTYWNE" zdziałałyby mnie tak, jak sądzę, – Scotch

+0

@Scotch Tak, po prostu przetestowane, wygląda na to, że mieć pole boolowskie, które można zapytać, po prostu przechodząc 'SELECT * FROM table WHERE booleanfield', które da ci wszystkie wiersze gdzie' booleanfield = true'. – harryg

Powiązane problemy