【问题标题】:why PHP casting MySQL BIT(1) value b'0' to boolean 'true'为什么 PHP 将 MySQL BIT(1) 值 b'0' 转换为布尔值'true'
【发布时间】:2016-02-01 10:56:43
【问题描述】:

我在 MySQL 中有一张表,其结构如下:

+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32)      | YES  |     | NULL    |                |
| bit   | bit(1)           | NO   |     | b'0'    |                |
+-------+------------------+------+-----+---------+----------------+

我插入一条记录如下:

+----+-------------+-----+
| id | name        | bit |
+----+-------------+-----+
|  1 | john        |     |
+----+-------------+-----+

然后我用一个PHP脚本来选择它,脚本如下:

    $pdo = new PDO("mysql:host=127.0.0.1;port=3306;dbname=Test", "username","password");

    $sql = "SELECT * FROM `for_test` WHERE `name` = :name";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':name' => 'john']);
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
         var_dump((boolean)$row['bit']);
    }

我希望输出应该是

bool(false)

但是,输出是

bool(true)

为什么 bit 0 会转换为 'true'?

【问题讨论】:

  • var_dump($row['bit'])
  • 你为什么还要称列bit。这就像给狗命名dog
  • 感谢@AbraCadaver。 var_dump($row['bit']) 输出字符串(1) ""。并且 var_dump(empty($row['bit'])) 输出 bool(false) 这意味着 $rows['bit'] 非空或非零。因此,如果 $row['bit'] 转换为布尔值,则它等于 'TURE',因为任何非零值都应被视为 'true'。 (参考文档 PHPempty())。但我很想知道 string(1) "" 是如何存储的。

标签: php mysql casting


【解决方案1】:

仔细观察,您会注意到 var_dump() 的输出显示字符串 length 为 1,not 0。它包含单个字符,因此不是一个空字符串,因此 empty() 和其他布尔比较将其评估为 true

至于什么这个字符...令人惊讶的是,至少在 PhP 5.4 和 MySQL 5.5 中,它是 NUL 字符!是的,ASCII 0, 0x00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2013-09-02
    相关资源
    最近更新 更多