MySQL INSERT 将 BIT 插入 1 而不是 0

Posted

技术标签:

【中文标题】MySQL INSERT 将 BIT 插入 1 而不是 0【英文标题】:MySQL INSERT inserting BIT to 1 instead of 0 【发布时间】:2019-02-06 16:19:14 【问题描述】:

我有以下查询,它应该插入 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));

所有插入都执行得很好,除了在 column6 中插入 1 而不是 0。 第 6 列的数据类型为 BIT。

查询运行良好,但是在执行时

INSERT INTO table1 (column6) VALUE (0);

直接在 phpmyadmin 'mysql' 选项卡中。

我错过了什么?

编辑: 使用

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

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

【问题讨论】:

传递绑定时的默认绑定类型是字符串,这意味着 0 将变为 '0',如果以某种方式转换为布尔值,它将变为 1。我建议您使用 bindValue使用第二个参数来明确说明您要绑定的类型。 【参考方案1】:

在传递给 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);

最后:如果这个布尔值总是为假,那么你可以将它直接传递给查询,比如:

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

【讨论】:

还值得注意的是,如果该值实际上是硬编码的,则没有真正需要为其使用参数,因为参数主要用于清理来自不受信任来源的输入。 @apokryfos :参数还允许 RDBM 通过跳过解析和准备执行计划来优化查询执行。如果没有绑定参数,RDBMS 通常无法识别您一次又一次地运行相同的查询。

以上是关于MySQL INSERT 将 BIT 插入 1 而不是 0的主要内容,如果未能解决你的问题,请参考以下文章

mybatis3 如何使用@Insert注解插入数据到数据库里为bit类型的字段

为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?

PHP PHP:使用数组将数据插入MySQL表[mysql] [php] [array] [INSERT]

PHP:使用数组[MySQL][PHP][Array][Insert]将数据插入MySQL表

我将boolean插入mysql中bit类型,读出来是false和true,但是用false查询用,是空的

使用mysql_insert_id插入大量数据