當使用陣列來傳遞數據,該數據被作爲字符串傳遞:
從docs:
值的數組與儘可能多的元件,因爲在結合的參數正在執行的SQL語句。所有值都被視爲PDO :: PARAM_STR。
但是,當您手動輸入1
直接將查詢作爲int處理時。讓我看看是否可以進一步挖掘一下,看看當一個字符串被轉換爲一個int時,內部發生了什麼。
編輯:這可能是已經提交併接受most similar bugs之一:
1)
SET @a = 1;
SELECT @a;
2)
SET @a = 1.1;
SELECT @a;
.. and this
3)
SET @a = 1.1;
SELECT @a + 7;
returns '8.100000000000000000000000000000'
(probably the addition will convert "1.1" to a double, the result
of the addition is also a DOUBLE and finally the DOUBLE is converted
to a string - that should be OK as well as far as I can understand)
所以看起來在內部,當你把它傳遞一個int MySQL是轉換爲雙。這將很好地解釋你所看到的行爲。
這是其他同類(數字並不完全正確)的列表錯誤你可能感興趣的:
http://bugs.mysql.com/bug.php?id=46037
http://bugs.mysql.com/bug.php?id=35071
http://bugs.mysql.com/bug.php?id=35071 < - 好一個展示Win和林之間的差異
和filtered list of data type bugs我仔細閱讀了哪些有趣的閱讀。
編輯2:啊!
這裏是一個bug that rather perfectly說明您的問題:
Reproduce code:
---------------
CREATE TABLE my_db.my_table (
id int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
<?php
$DB = new PDO('mysql:dbname=my_db;host=localhost', 'user', 'pass');
$stmt = $DB->prepare('select * from my_table where id>?');
$stmt->bindValue(1, 13);
$stmt->execute();
?>
or
<?php
$DB = new PDO('mysql:dbname=my_db;host=localhost', 'user', 'pass');
$stmt = $DB->prepare('select * from my_table where id>?');
$stmt->execute(array(13));
?>
Expected result:
----------------
select * from my_table where id>13
Actual result:
--------------
select * from my_table where id>'13'
什麼是 「落後」 $ DB?一個sqlite,MySQL,postgresql,???連接? – VolkerK
MySQL,它是PDO的包裝。 – PPPHP