2013-06-28 15 views
11

Quando eseguo una query in MS Access posso tranquillamente utilizzare una query come questa:Perché l'accesso MS è booleano true -1 anziché vero o vero?

SELECT clients.* FROM clients WHERE active=True; 

o

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

ma non

SELECT clients.* FROM clients WHERE active=1; 

Inoltre, dire che voglio interrogare il database usando PDO Potrei usare una dichiarazione preparata:

$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 

Quindi, anche se true funziona quando si invia una query semplice ad Access, se il binding solo -1 o 0 funzionerà per booleano.

Perché è questo e perché è -1 rappresentativo di true quando 1 significa di solito true in altre lingue/banche dati?

risposta

6

io non riesco a trovare la fonte esatta questo è da, ma mi ricordo di aver letto su questo qualche tempo fa sul credo MSDN. Questo answer ha una descrizione tecnica del valore booleano di Visual Basic true, che si applica anche a Access.

Se ricordo bene, è perché -1 è rappresentato in binario con ogni bit impostato a 1 (1111 1111), mentre uno ha solo il bit meno significativo impostato a 1 con il resto 0 (0000 0001). Perché false è rappresentato come 0 (0000 0000), è molto facile per passare da true e false utilizzando un NOT bit a bit, ma se è stato true ogni altra cosa, un NOT bit a bit si tradurrebbe in qualcosa che non è false. Inoltre, l'utilizzo di AND bit a bit per verificare la verità su qualsiasi valore di verità avrebbe funzionato, mentre se era vero era 0000 0001 non lo sarebbe.

+0

Sembra logico. Ovviamente Access può far fronte ad un 'true' alimentato in una normale istruzione, ma le query vincolanti non possono creare un problema a meno che non si fornisca il valore corretto. '<> 0' sembra una buona soluzione per' true' come @ChristianSpecht menzionato – harryg

+0

Sì, Christian ha ragione a riguardo. Ho solo pensato di rispondere alla seconda parte della tua domanda. – jonhopkins

+1

+1 Un altro modo di guardare è che un intero con [complemento a due] (http://en.wikipedia.org/wiki/Two%27s_complement) che è lungo solo un bit può essere solo uno dei due valori: 0 o -1. –

0

Non cercare di essere faceto, ma la risposta è "perché è così che l'hanno fatto". La tua affermazione che 1 in genere significa vero in altre lingue non è corretta. Ad esempio, in C/C++, false è definito come == 0 e true è definito come! = 0.

Ecco perché si può dire che se (puntatore) {...}

+0

Un valore sufficiente, ma '1! = 0', quindi è necessario restituire true. Questo non è il caso della mia domanda: non vengono forniti risultati, sia veri che falsi. Fondamentalmente 1! = Vero o falso – harryg

+0

Regola del pollice: prova i valori booleani, non li confronta. Ad esempio, non dire se (testFunction() == true), basta dire se (testFunction()) Questo diventa disordinato quando si sta tentando di simulare l'esclusivo o (if (function1()! = Function2()) The safe e il modo corretto per farlo è leggermente più dettagliato: if function1() then!function2() else function2() è garantito per chiamare ogni funzione una volta e darvi l'esclusivo o dei risultati. –

4

non so una risposta migliore a "Perché questo" di Dale Wilson già detto in his answer, ma è abbastanza semplice per aggirare questo problema:

Basta abituarsi a utilizzare WHERE active <> 0 nelle query.

Sto utilizzando MS Access (dove True è -1) e MS SQL Server (dove True è 1) e controllando <> 0 è il modo più semplice che funziona sempre.

+1

O semplicemente 'WHERE Active' (non l'ho provato con le mie tabelle SQL Server, ma' WHERE ACTIVE' e 'WHERE NOT ACTIVE' farebbero il trucco Penso che – Scotch

+0

@Scotch Sì, avendo appena testato, sembra che tu avere un campo booleano puoi interrogarlo semplicemente andando in 'SELECT * FROM table WHERE booleanfield' che ti darà tutte le righe dove' booleanfield = true'. – harryg