2017-03-15 110 views
2

我在我們的mysql數據庫中存儲64位Facebook ID。當我查看數據庫表的值是32位。我正在使用Laravel和PDO連接。這些值如果傾倒出來,在綁定中是正確的。一旦執行,它們在數據庫中不同。我曾嘗試將數據庫從MariaDB更改爲MySQL,以查看它是否是導致它的數據庫。一切都指向它是PDO。使用PDO從64位轉換爲32位的整數

這不會發生在我的本地開發機器上,它使用的是完全相同的PHP 7.0.15版本。我在開發或本地方面都沒有錯誤。

MySQL和PHP是64位版本。我一直無法找到任何有助於我解決問題的方法。

我發現自2013年起this bug report,這清楚地說明了我的問題,但似乎已經解決。

在Laravel的Connection類中,bindValues方法正在檢查數據類型。

public function bindValues($statement, $bindings) 
{ 
    foreach ($bindings as $key => $value) { 
     dump($value); // Value is correct at this point. 
     $statement->bindValue(
      is_string($key) ? $key : $key + 1, $value, 
      is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR 
     ); 
    } 
} 

我自己也嘗試設置第三個參數去只是PDO::PARAM_STR但是這並沒有改變行爲。

服務器是CentOS Linux 7.3.1611,MySQL是5.7.17,PHP 7.0.15

PDO和MySQL擴展

php70w-pdo.x86_64     7.0.15-1.w7 @webtatic 
php70w-mysql.x86_64     7.0.15-1.w7 @webtatic 

該表是InnoDBUTF-8 Unicode編碼和核對是utf8_unicode_ci

SQL連接是:

'charset' => 'utf8', 
'collation' => 'utf8_unicode_ci', 
'prefix' => '', 
'strict' => true, 
'modes' => ['STRICT_TRANS_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','ERROR_FOR_DIVISION_BY_ZERO','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'], 
'engine' => null, 

我可以嘗試解決我的問題?

+2

什麼是列類型? – AbraCadaver

+0

該列是一個varchar(100)。我嘗試了BIGINT,並且出現了超出範圍的錯誤。 – brenjt

+0

你必須展示你如何得到並回應它,因爲它應該工作得很好,因爲它們是字符串,除非你施放它們,計算它們等等...... – AbraCadaver

回答

0

我找到了解決方案。我們的服務器使用了常規的php70-mysql驅動程序,而不是本地驅動程序php70-mysqlnd。一旦我們更新整數保存。