我在IsTrial
类型的MySQL中有bit(1)
和NULL set to No
default value of 0
现在这个条件:
if(!empty($subscription['IsTrial']) && (bool)$subscription['IsTrial'] == TRUE )
{
echo ' (Trial)';
}
..它总是true
,因为mysql实际上没有设置默认值0
,它保持字段BLANK ??为了使上述条件有效,我必须将MYSQL中的默认值从0
设置为null
,但我不想这样做。
我真的很困惑这里发生了什么,为什么默认值0
没有设置且字段保持空白?
重申一下,问题是,当没有手动指定值时,mysql不保存默认值0
的字段,它会保留导致条件失败的字段BLANK。
答案 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个字节。