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