使用PDO预处理语句在MySQL中插入BIT值

7

我如何使用PDO预处理语句在MySQL中插入BIT值?以下是我的尝试和结果。

<?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
@Barmar 测试85返回id 4和数据255 - user1032531
嗯,也许你可以从这些问题中获得一些见解:http://stackoverflow.com/search?q=pdo+prepare+title%3Abit - Barmar
根据mysql文档,位字面格式为b'01010101' - 你试过了吗? - Sam Dufel
@SamDufel 没有准备好的语句,db::db()->exec("INSERT INTO test(id,data) VALUES(0,b'01010101')"); 可以工作。我尝试将 'b"01010101"' 更改为 "b'01010101'",但没有变化。 - user1032531
1个回答

6

如果您不在终端附近进行检查,但我相信您必须将其绑定到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上检索出了一个类似的以前的答案。请查看此链接

据我所记,您无法通过PDO将位发送到MySQL:您最多只能发送整数,即使是这样,如果您不明确告诉PDO使用整数,则它会作为字符串发送。 如果您的用例是在数据库中存储位字段,则bindValue整数表示即可(如上所示)。 但是,如果您的用例是从已知一组可能的位字段中按位字段进行选择,则直接在查询中对它们进行编码即可。 - bishop
我的应用程序是一个基本的权限系统。我有一个6位值,表示用户读取/用户写入/组读取/组写入/公共读取/公共写入。我的WHERE子句将检查字段的某些位是否设置。看起来我可以使用TINYINT来实现这一点。同意吗?感谢您的帮助! - user1032531
是的,TINYINT 简单并且更好地映射到您正在进行的操作:位掩码。如果您有大量比特值(0到2 ** 63-1),并且绝对关心存储消耗,则使用 BIT 是最佳选择。查看此文章 - bishop
刚刚测试了 TINYINT,我得到了所需的功能。我会选择这个方案。再次感谢。 - user1032531
1
@user1032531 - 对于你来说,mysql的SET数据类型可能更适合 - 它在内部映射为位掩码检查,但通过字符串标识符使您可以访问它。 - Sam Dufel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接