4

IsTrialMySQL に と のタイプのbit(1)このフィールドがNULL set to Noありますdefault value of 0

ここに画像の説明を入力

今この条件:

if(!empty($subscription['IsTrial']) && (bool)$subscription['IsTrial'] == TRUE ) 
{ 
    echo ' (Trial)'; 
}

.. truemysql は実際には のデフォルト値を設定しないため0、フィールドを空白のままにします?? 上記の条件を機能させるには、MYSQL のデフォルト値を から に設定する必要があります0null、そうしたくありません。

ここで何が起こっているのか本当に混乱しています。なぜデフォルト値0が設定されておらず、フィールドが空白のままなのですか?

繰り返しますが、問題は、値が手動で指定されていない場合、mysql はフィールドをデフォルト値で保存せず、フィールドを空白のままにして、条件が失敗することです。0

4

1 に答える 1

6

フィールドは空白ではありません。バイナリ値は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バイトに切り上げられます。

于 2013-03-10T15:42:08.787 に答える