该字段不为空。它的二进制值是 0。
您没有将默认值定义为0
,即 ASCII 码为 48 的字符。您将默认值定义为二进制值 0,即nul
ASCII 字符。当您尝试将 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 个字节。