2012-04-09 138 views
1

我發現的唯一類似問題是:Insert php boolean into mysql bit column with Zend_Db但這沒有答案。MySQL PDO錯誤:當爲BIT列傳遞布爾參數時,'數據列太長'

請參閱下面的簡化測試:

'允許'列類型是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驅動程序中的錯誤,還是隻是我?

非常感謝您期待您的幫助。

回答

1

似乎PHP並沒有將「true」解釋爲布爾值。 PHP.NET表示PDO :: PARAM_BOOL是一個整數。在版本5.0之後,對datatype 'bit'列的MySQL解釋發生了變化。這意味着PHP可能試圖將一個完整的整數(32位)插入到具有不可預知的位數(1-64)的列中。

+0

感謝您的答覆。我試過: '$ query-> bindValue(「allow」,1,PDO :: PARAM_BOOL);' 但是,這仍然失敗。 – 2012-04-09 18:10:43

+0

你使用的是什麼版本的MySQL?特別是,你知道你的字符集嗎? 'SHOW VARIABLES LIKE 「%版本%」 的 – 2012-04-09 18:14:49

+0

結果;' innodb_version \t 1.1.8 PROTOCOL_VERSION slave_type_conversions \t 版本\t 5.5.22 version_comment \t MySQL社區服務器(GPL) version_compile_machine version_compile_os \t Win64 我正在使用'UTF8 - 默認集合'字符集。 – 2012-04-09 18:18:23

2

使用CAST功能:

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