2013-03-10 95 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