2017-03-15 80 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。一旦我们更新整数保存。