默认值不会粘在mysql中

时间:2013-03-10 15:18:40

标签: php mysql conditional-statements

我在IsTrial类型的MySQL中有bit(1)NULL set to No

的字段default value of 0

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。

1 个答案:

答案 0 :(得分: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可以满足大多数用户的需求,即将这些BIT值分别映射到字符串值“0”和“1”。这是一些测试代码(使用PHP 5.3.15,MySQL 5.5.30):

$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个字节。