php - 默认值不在 mysql 中

标签 php mysql conditional-statements

我在 MySQL 中有 IsTrial 类型的 bit(1) 字段 NULL 设置为 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 保存字段,它会保留导致条件失败的字段 BLANK。

最佳答案

该字段不是空白。它的二进制值为 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 值分别映射到 string 值“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) CHARACTER SET ASCII。两者都需要 1 个字节用于存储。

BIT(1) 的唯一优点是它拒绝除 0 或 1 之外的任何值。但是这种数据类型的存储要求无论如何都向上舍入到 1 个字节。

关于php - 默认值不在 mysql 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323798/

相关文章:

php - 我可以让 PHP 的 PDO 返回 MySQL 警告,而不仅仅是错误消息吗?

mysql - COUNT 后的 SUM 和 Group By MYSQL

mysql - 什么情况会鼓励我使用 ENUM 而不是其他替代方案?

mysql - 我可以设置一个条件来过滤我的 COUNT 子句吗?数据库

.net:硬编码条件还是什么?

php - Mysql - 获取月份和年份的数量

php - MySQL 没有一致地更新行?

mysql - 在 MySQL Rails 4 中使用数组

c++ - 为什么这个 for 循环条件不起作用?

php - 将应用程序连接到本地mysql数据库