MySQL INSERT将BIT插入1而不是0

时间:2019-02-06 16:19:14

标签: php mysql sql pdo

我有以下查询,该查询应插入0但插入1。 它是用PHP中的准备好的语句执行的:

$insertsql= 
    "INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
    VALUES (?, ?, ?, ?, ?, ?)";
$insertstmt = $pdo->prepare($insertsql);
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, 0));

除在列6中插入1而不是0之外,所有插入操作均正常进行。 列6的数据类型为BIT。

查询在执行时工作正常

INSERT INTO table1 (column6) VALUE (0);

直接在phpmyadmin的“ MySQL”标签中。

我想念什么?

编辑: 使用

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

按预期工作。为什么0在SQL查询中直接起作用,而在使用pdo执行时却不起作用?

1 个答案:

答案 0 :(得分:3)

在将该参数传递给PDO时,需要将该参数明确声明为布尔值。

来自the PDO execute documentation

  

input_parameters

     

一个值数组,其中元素的数量与正在执行的SQL语句中绑定的参数一样多。所有值均视为PDO::PARAM_STR

这不是您想要的。

因此,您需要更改逻辑以避免使用execute(array())构造,而是使用bindValue()分别绑定每个参数。对于布尔值:

$insertstmt->bindValue(':col6', false, PDO::PARAM_BOOL);

由于布尔值在MySQL中只是TINYINT(1),因此PDO::PARAM_INT也应该可以正常工作:

$insertstmt->bindValue(':col6', 0, PDO::PARAM_INT);

最后:如果此布尔值始终为false,则可以将其直接传递给查询,例如:

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

spencer7593明智地指出,另一种选择是从SQL内部进行类型转换。例如,可以使用:

将字符串转换为位值
INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
VALUES (?, ?, ?, ?, ?, IF( ? ='0', b'0', b'1') )