为什么PHP将MySQL BIT(1)值b'0'转换为布尔值'true'

时间:2015-11-01 13:35:49

标签: php mysql casting

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

T2.tnumber

我插入一条记录如下:

+-------+------------------+------+-----+---------+----------------+
| 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'    |                |
+-------+------------------+------+-----+---------+----------------+

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

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

我希望输出应该是

    $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)

为什么第0位转换为'true'?

1 个答案:

答案 0 :(得分:0)

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

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