php - 为什么 PHP 转换 MySQL BIT(1) 值 b'0' to boolean ' true'

标签 php mysql casting

我在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)

为什么位 0 转换为“true”?

最佳答案

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

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

关于php - 为什么 PHP 转换 MySQL BIT(1) 值 b'0' to boolean ' true',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462705/

相关文章:

c++ - 使用指针算法计算类型大小的替代方法

php - 如何解析这个 php 服务器响应以消除空元素?

mysql - group_concat 值大于特定值

mysql - 循环查询,即使找到匹配项

php - 如何使用文本区域将这些数据存储在数据库中?

java - 测试方法的返回类型是否为数字?

c++ - 当有符号/无符号不匹配时会发生什么转换?

javascript - Ajax 只运行一次

php - 如何以不同于其他帖子的方式显示第一篇帖子?

php - 如何在 php 中回显 '