我在MySql中有这个专栏:
male BOOLEAN COMMENT "true for male",
我使用这个查询插入使用PDO包装在Drupal:
$id = db_insert('Person')->fields(array(
.......
'male' => false,
)
)->execute();
我得到这个错误:
WD php: PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect^[[31;40m^[[1m][错误]^[[0m整数值:"对于列'male'在行1: INSERT INTO .....
但是如果我用'male'=>true
替换,查询工作。令人惊讶的是,如果我用false
代替0
或(int)false
,那么它也可以工作!
表示在此上下文中,false被转换为"(空字符串)"。
我想知道为什么它在这里被转换为字符串。
我有相关的问题在这里:在PHP中,为什么是真cast 1和假cast一个空字符串?但它没有回答为什么PHP将false转换为string?
这是一个错误(PHP PDO或MySQL)。布尔值FALSE应该被转换为int 0,但却被转换为空字符串。在下面的问题中可以看到MySql中非常旧的bug报告的链接:
复制:PDO-MySQL:布尔值在准备好的语句绑定上转换为1或空字符串
$values = array_map(function ($v) { return is_bool($v) ? (int) $v : $v; }, $values)