フィールドは空白ではありません。バイナリ値は0です。
デフォルト値をに定義していません0
。つまり、ASCIIコード48の文字です。デフォルト値をASCIIの文字であるバイナリ値0に定義しましたnul
。ASCIIヌルを文字列として出力しようとすると、表示された表現はありません。同様に、値1
は2進値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を使用できます。もう1つのオプションは、CHAR(1)CHARACTERSETASCIIです。どちらもストレージに1バイトが必要です。
BIT(1)の唯一の利点は、0または1以外の値を拒否することです。ただし、このデータ型のストレージ要件は、とにかく1バイトに切り上げられます。