2013-03-10 163 views
4

堅持我這個領域IsTrial在MySQL bit(1)類型與NULL set to Nodefault value of 0默認值不會在MySQL

enter image description here

現在這種情況:

if(!empty($subscription['IsTrial']) && (bool)$subscription['IsTrial'] == TRUE) 
{ 
    echo ' (Trial)'; 
} 

..讓它一直都true,因爲mysql實際上沒有設置0的默認值,它保持字段BLANK?爲了使上述條件起作用,我必須將MYSQL中的默認值從0設置爲null,但我不想那樣做。

我真的很困惑這是怎麼回事,爲什麼默認值0沒有設置,並且該字段保持空白?

重申,的問題是,當沒有手動指定值時,mysql不保存缺省值爲0的字段,它會保留導致條件失敗的字段BLANK。

+0

那麼您手動設置了該值。問題是,當沒有指定值時,mysql不會保存默認值爲'0'的字段。 – 3zzy 2013-03-10 15:29:04

回答

6

該字段不是空白。它具有二進制值0

你沒有默認值定義到0,即用ASCII碼48字符您定義的默認值,以二進制值0,這是ASCII碼字符nul 。當您嘗試將ASCII nul打印爲字符串時,沒有可見的表示形式。同樣值1是二進制值1,或Control-A,它也不是打印字符。

mysql> create table t (isTrial bit(1) not null default 0); 

mysql> insert into t() values(); 
mysql> insert into t (isTrial) values (DEFAULT); 
mysql> insert into t (isTrial) values (0); 
mysql> insert into t (isTrial) values (1); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> select * from t; 
+---------+ 
| isTrial | 
+---------+ 
|   | 
|   | 
|   | 
|  | 
+---------+ 

mysql> pager cat -v 
PAGER set to 'cat -v' 
mysql> select * from t; 
+---------+ 
| isTrial | 
+---------+ 
|   | 
|   | 
|   | 
| ^A  | 
+---------+ 

但是PHP做什麼大多數用戶可能想,這是分別值「0」和「1」這些位值映射到字符串。這裏是(使用PHP 5.3.15,MySQL的30年5月5日)的一些測試代碼:

$stmt = $dbh->prepare("select isTrial from t"); 
$result = $stmt->execute(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    var_dump($row); 
    if(!empty($row['isTrial']) && (bool)$row['isTrial'] == TRUE) 
    { 
     echo "isTrial is true\n"; 
    } else { 
     echo "isTrial is false\n"; 
    } 
    echo "\n"; 
} 

輸出:

$ php bit.php 
array(1) { 
    ["isTrial"]=> 
    string(1) "0" 
} 
isTrial is false 

array(1) { 
    ["isTrial"]=> 
    string(1) "0" 
} 
isTrial is false 

array(1) { 
    ["isTrial"]=> 
    string(1) "0" 
} 
isTrial is false 

array(1) { 
    ["isTrial"]=> 
    string(1) "1" 
} 
isTrial is true 

回覆您的評論:

使用BIT(1)應對於PHP工作正常,但是當我們直接在查詢工具中查看數據時,會造成混淆。如果你想讓數據更清晰,你可以使用TINYINT。另一個選項是CHAR(1)CHARACTER SET ASCII。兩者都需要1個字節進行存儲。

BIT(1)的唯一優點是它拒絕除0或1之外的任何值。但無論如何,此數據類型的存儲要求最多可達1個字節。

+1

+1非常有效的解決方案以及測試案例 – swapnesh 2013-03-10 15:59:07

+0

所以你的意思是我應該在這種情況下使用'tinyint'而不是'bit'? – 3zzy 2013-03-10 16:34:43