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表