MySQL PDO错误:传递BIT列的布尔参数时,“数据太长了”

时间:2012-04-09 18:00:41

标签: php mysql pdo

我发现的唯一类似问题是:Insert php boolean into mysql bit column with Zend_Db但是没有答案。

请参阅下面的简化测试:

“允许”列类型为BIT 'roleID'列类型为INT 'permID'列类型为INT。

$dbo = new PDO("mysql:dbname=database;host=127.0.0.1", "phpuser", "pass");

$query = $dbo->prepare("INSERT INTO ws_role_perms (allow, roleID, permID)
                            VALUES (:allow, :roleID, :permID)");

$query->bindValue("allow", true, PDO::PARAM_BOOL);
$query->bindValue("roleID", 1, PDO::PARAM_STR);
$query->bindValue("permID", 2, PDO::PARAM_STR);

if ($query->execute() == false) {
    throw new Exception(print_r($query->errorInfo(), true));
}

我收到的错误消息是:

Array (
    [0] => 22001
    [1] => 1406
    [2] => Data too long for column 'allow' at row 1
)

如果我尝试将等效查询直接放入MySQL,即运行查询:INSERT INTO ws_role_perms (allow, roleID, permID) VALUES (true, 1, 2) 我没有问题。

这是MySQL PDO驱动程序中的错误,还是仅仅是我?

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

好像PHP并没有将'true'解释为布尔值。 PHP.NET表示PDO :: PARAM_BOOL是一个整数。在版本5.0之后,对datatype 'bit'的列的MySQL解释发生了更改。这意味着PHP可能试图将一个完整的整数(32位)插入到具有不可预测的位数(1-64)的列中。

答案 1 :(得分:2)

使用Cast功能:

Values ( CAST( :allow AS UNSIGNED), :roleID, :permID)

答案 2 :(得分:1)

$query = $dbConnection->prepare("UPDATE roles SET isTrue= b? WHERE itemID = ?;");
$result = $query->execute(array(true,$productID_GET));

在变量前使用'b'使其可以进行对话,以获取要插入的任何值。

在我的情况下,我有位列,并且遇到相同的错误。我就是这样解决的。

答案 3 :(得分:0)

我启用了.envANSI模式,我不得不使用以下结构:

TRADITIONAL

如果您提供PHP'null',则会将该列设置为NULL。其他MySQL将评估提供的变量。如果为零,则列将设置为FALSE;如果不为零,则列将设置为TRUE。

我希望这会有所帮助。