使用PDO准备语句在MySQL中插入BIT值

24 浏览
0 Comments

使用PDO准备语句在MySQL中插入BIT值

我如何使用PDO Prepared Statement在MySQL中插入一个BIT值?以下是我的尝试和结果。

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("对于{$value}的测试返回id {$rs['id']}和数据{$rs['data']}");
}
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'");

结果:

对于b"01010101"的测试返回id 1和数据255
对于b01010101的测试返回id 2和数据255
对于01010101的测试返回id 3和数据255
对于85的测试返回id 4和数据255
对于b'01010101'的测试返回id 5和数据255

0
0 Comments

问题出现的原因是PDO在插入BIT值时存在问题,无法直接将BIT值绑定到PDO语句中。解决方法是将BIT值转换为整数并使用bindValue方法将其绑定为整数。另外,也可以直接在查询中手动添加BIT值,或者使用TINYINT(1)类型代替BIT类型。

根据之前的回答,可以使用bindValue方法将整数表示的BIT值绑定到PDO语句中。如果需要根据一组已知的BIT字段进行选择,也可以直接在查询中编码BIT值。

对于应用程序的基本权限系统,使用TINYINT类型更简单且更符合需求。而BIT类型适用于具有广泛的位值范围(0到2**63-1)且对存储消耗非常关注的情况。

另外,还提到mysql的SET数据类型可能更适合此场景,它在内部映射为位掩码检查,并通过字符串标识符进行访问。

最后,经过测试,使用TINYINT类型可以满足功能需求,所以决定采用这种方式。

参考资料:

- [similar previous answer](https://stackoverflow.com/a/10542145/2908724)

- [Check out this article](http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/)

0