我在PHP和MySQL的匹配版本上試過這個,它似乎是奇怪的關於PHP「mysql」函數處理位域的方式,或者至少是我不明白的東西。它看起來有點像一個bug。它可以像我期望的那樣在「mysqli」擴展中運行。這是我的嘗試:
<?php
// mysql:
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db("test", $conn);
$result = mysql_fetch_array(mysql_query('SELECT EVENT_PRIVATE FROM test WHERE id = 2'));
var_dump($result);
/* Result:
array(2) {
[0]=>
string(1) ""
["EVENT_PRIVATE"]=>
string(1) ""
}
*/
// mysqli:
$mysqli = new mysqli('localhost', 'test', 'test', 'test');
$mysqli_result = $mysqli->query('SELECT EVENT_PRIVATE FROM test WHERE id = 2');
$result = $mysqli_result->fetch_array();
var_dump($result);
/* Result:
array(2) {
[0]=>
string(1) "1"
["EVENT_PRIVATE"]=>
string(1) "1"
}
*/
編輯:啊哈!
該書"High Performance SQL"說'MySQL將BIT視爲字符串類型,而不是數字類型;當您檢索BIT(1)值時,結果是一個字符串,但其內容是二進制值0或1,而不是ASCII值「0」或「1」。
我期待BIT能夠像SQL Server「bit」數據類型一樣,它是爲存儲布爾值true/false(0/1)值而設計的。但是,在MySQL中它更像是一個位域 - 與SQL Server不同,例如,您可以有一個位(8)字段,其長度爲8位。而MySQL有一個特定的「布爾」類型,用於存儲布爾值。
我猜這是發生了什麼事情的根源。請注意,mysql結果返回的是字符串(1) - 這是一個單字符長字符串,而不是空字符串,它將是字符串(0)。如果你看看單個字符的值:
echo ord($result['EVENT_PRIVATE']);
1
......那麼這是ASCII 1!
所以,我想說,發生了什麼可能,奇怪的是,由設計。 mysql擴展是解釋位域的一個非常直接的字符,並且給出了一個字符串編碼的實際位,它們存儲在MySQL的字段中,位級。 mysqli擴展也許有點友好,並將該值轉換爲位的字符串表示。
我要把它留給你,如果你搶位(8)設置爲使用mysql和mysqli的10101010發生了什麼實驗?
什麼做`的var_dump($決賽[ 'EVENT_PRIVATE']);`,`的var_dump($最後);`和`var_dump($ result);`show?如果它的布爾型假或空字符串沒有可見的輸出將是所需的行爲。 – 2011-02-02 16:40:57
如果您將查詢更改爲「SELECT EVENT_PRIVATE FROM events ...」而不是「SELECT * FROM events ...」,您在phpMyAdmin中看到了什麼?那一欄的實際價值是多少? – 2011-02-02 16:41:33
而`$ result ['EVENT_PRIVATE']`有一個合適的值?什麼`var_dump`打印? – Gumbo 2011-02-02 16:41:44