MySQL中默认值不生效

4

我在MySQL中有一个类型为bit(1)的字段IsTrialNULL设置为No默认值为0

enter image description here

现在有这个条件:

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

在这里,问题总是返回true,因为MySQL实际上没有设置0的默认值,它保持字段为空白?为了使上述条件起作用,我必须在MYSQL中将默认值从0更改为null,但我不想这样做。

我真的很困惑这里发生了什么,为什么默认值0没有被设置而字段仍然为空白?

为了重申,问题在于MySQL在未手动指定值时不保存带有默认值0的字段,而会使字段保持为空白,导致条件失败。


你可以手动设置该值。问题在于,当尚未指定值时,MySQL不会将字段保存为默认值0 - eozzy
1个回答

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

关于您的评论:

在PHP中使用 BIT(1) 应该可以正常工作,但是当我们在查询工具中直接查看数据时,它会引起混淆。如果您想使数据更清晰明了,可以使用 TINYINT。另一个选择是使用CHAR(1),并设置字符集为 ASCII。这两种方式都需要 1 个字节来存储。

BIT(1) 的唯一优点是它拒绝除 0 或 1 以外的任何值。但是此数据类型的存储要求仍然向上取整为 1 字节。


那么你的意思是在这种情况下我应该使用 tinyint 而不是 bit 吗? - eozzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接