该字段不是空白的。它具有二进制值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
关于您的评论:
在PHP中使用 BIT(1) 应该可以正常工作,但是当我们在查询工具中直接查看数据时,它会引起混淆。如果您想使数据更清晰明了,可以使用 TINYINT。另一个选择是使用CHAR(1),并设置字符集为 ASCII。这两种方式都需要 1 个字节来存储。
BIT(1) 的唯一优点是它拒绝除 0 或 1 以外的任何值。但是此数据类型的存储要求仍然向上取整为 1 字节。
0
。 - eozzy