使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值

Posted

技术标签:

【中文标题】使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值【英文标题】:Insert BIT value in MySQL using PDO Prepared Statement 【发布时间】:2014-10-23 13:42:45 【问题描述】:

如何?以下是我的尝试和结果。

<?php
function testIt($value)

    $sql='INSERT INTO test(id,data) VALUES(?,?)';
    $stmt=db::db()->prepare($sql);
    $stmt->execute(array(0,$value));
    $id=db::db()->lastInsertId();

    $sql='SELECT * FROM test WHERE id='.$id;
    $stmt=db::db()->query($sql);
    $rs=$stmt->fetch(PDO::FETCH_ASSOC);
    echo("Test for $value returns id $rs['id'] and data $rs['data']<br>");


date_default_timezone_set('America/Los_Angeles');
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once('../../ayb_private/dbase.php');

$sql='CREATE TEMPORARY TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, data BIT(8) NOT NULL DEFAULT 00000000, PRIMARY KEY (id) )';
$stmt=db::db()->exec($sql);

testIt('b"01010101"');
testIt('b01010101');
testIt('01010101');
testIt(0x55);
testIt("b'01010101'");
?>

结果:

Test for b"01010101" returns id 1 and data 255
Test for b01010101 returns id 2 and data 255
Test for 01010101 returns id 3 and data 255
Test for 85 returns id 4 and data 255
Test for b'01010101' returns id 5 and data 255

【问题讨论】:

testIt(0x55) 工作吗? @Barmar Test for 85 returns id 4 and data 255 嗯,也许你可以从这些问题中得到启示:***.com/search?q=pdo+prepare+title%3Abit 根据 mysql 文档,位文字格式是 b'01010101' - 你试过吗? @SamDufel 没有准备好的声明,db::db()-&gt;exec("INSERT INTO test(id,data) VALUES(0,b'01010101')"); 有效。我尝试将'b"01010101"' 更改为"b'01010101'",但没有任何变化。 【参考方案1】:

不在要检查的终端附近,但我相信您必须键入 bind 它到 INT 并将其作为 INT 发送,而不是“b010101”(或其他):

$sql='INSERT INTO test(id,data) VALUES(:id,:bit)';
$stmt=db::db()->prepare($sql);
$stmt->bindValue('id', null, PDO::PARAM_NULL);
$stmt->bindValue('bit', (int)$value, PDO::PARAM_INT);
$stmt->execute();

在 Google 上的快速检查发现了这个similar previous answer。

【讨论】:

使用您的解决方案和testIt(0x55); 似乎有效。而不是绑定,也许只是使用 PHP 转换二进制值可能有效? 这篇文章回答了这个问题,但确实提供了我想听到的答案。 PDO 似乎不适用于 BIT 值。由于这些值不是用户提供的,我想我可以手动将它们添加到我的查询中。或者可能将 BIT 类型全部丢弃并使用TINYINT(1)。想法? @user1032531 我记得,你不能通过 PDO 向 MySQL 发送一点:你最好总是发送一个整数,即使那样,如果你没有明确告诉 PDO使用整数,它作为字符串发送。如果您的用例是将位字段存储在数据库中,那么bindValue 整数表示并且它可以工作(如上)。如果您的用例是从一组已知的可能位字段中按位字段进行选择,只需在查询中直接对它们进行编码。 我的应用是一个基本的权限系统。我有一个代表 user_read/user_write/group_read/group_write/public_read/public_write 的 6 位值。我的 WHERE 子句将检查是否设置了字段的某些位。看来我可以用 TINYINT 做到这一点。同意?感谢您的帮助! @user1032531 - mysql SET 数据类型可能更适合您 - 它在内部映射到 mysql 作为位掩码检查,但允许您通过字符串标识符访问它。

以上是关于使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在SELECT FROM PDO Prepared Statement中为搜索框设置多个搜索条件?

PDO Prepared Statement over ODBC Sybase“PARAM 数据流”错误

Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询

PDO Prepared在单个查询中插入多行

使用 Prepared Statement 设置 LONG 数据类型

当 Statement 与 Java 和 Oracle 一起使用时,Prepared Statement 不起作用