2013-06-28 50 views
11

當我運行在MS Access查詢,我可以愉快地使用這樣的查詢:爲什麼MS訪問布爾值爲真-1而不是1或真?

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發送一個普通的查詢訪問時,如果綁定只有-10將工作布爾值。

這是爲什麼,爲什麼-1代表true1通常意味着在其他語言/數據庫true

回答

6

我似乎無法找到確切的來源,這是從,但我記得前一陣子上我覺得MSDN閱讀此。這answer有一個Visual Basic的布爾true的技術描述,也適用於Access。

如果我沒記錯的話,這是因爲-1以二進制表示,每位設置爲1(1111 1111),而+1只有最低有效位設置爲1,其餘0(0000 0001)。因爲false表示爲0(0000 0000),所以使用按位NOT可以非常容易地在truefalse之間切換,但是如果true是其他內容,則按位NOT將導致不是false的內容。此外,使用按位AND來檢查任何真值的真值是可行的,而如果真是0000 0001它不會。

+0

這似乎很合乎邏輯。很明顯,Access可以應付在正常語句中被賦予'true',但綁定查詢不會產生問題,除非您給它提供適當的值。對於'true','<> 0'好像是一個很好的解決方法@ChristianSpecht提到 – harryg

+0

是的,基督徒對此是正確的。我只是想我會回答你的問題的第二部分。 – jonhopkins

+1

+1另一種看待它的方式是,只有一位長的[二補](http://en.wikipedia.org/wiki/Two%27s_complement)有符號整數只能是兩個值中的一個:0或-1。 –

0

沒有試圖變得滔滔不絕,但答案是「因爲這就是他們這樣做的方式。」你在其他語言中通常表示爲真的陳述不正確。例如,在C/C++中,false被定義爲== 0,而true被定義爲!= 0。

這就是爲什麼你可以說,如果(指針){...}

+0

夠公平的,但'1!= 0'所以應該肯定會返回true。在我的問題中,情況並非如此 - 無論結果如何,都無論是真是假。基本上1!= true或false – harryg

+0

經驗法則:測試布爾值,不要比較它們。例如,不要說if(testFunction()== true),只是說if(testFunction())當你試圖模擬獨佔或(if(function1()!= function2())時,正確的方法來做到這一點稍微冗長:if function1()then!function2()else function2()保證調用每個函數一次,並給你排他或結果。 –

4

我不知道一個更好的答案,「這是爲什麼」比戴爾·威爾遜在his answer已經說過,但它是很簡單的繞過這個問題:

只是習慣了在查詢中使用WHERE active <> 0

我使用的MS Access(其中True-1)和MS SQL Server(其中True1)和檢查<> 0是一種永遠奏效的最簡單的方法。

+1

或者只是'WHERE活躍'(我沒有測試過這與我的SQL Server表,但'WHERE ACTIVE'和'WHERE NOT ACTIVE'會做詭計,我認爲 – Scotch

+0

@Scotch是的,剛剛測試過,似乎如果你有一個布爾型字段,你可以通過查詢SELECT * FROM table WHERE booleanfield來查詢它,它會給你'booleanfield = true'的所有行。 – harryg

相關問題