使用PDO将整数从64位转换为32位

时间:2017-03-15 17:56:47

标签: php mysql pdo

我在我们的mysql数据库中存储64位Facebook ID。当我查看数据库表时,值为32位。我正在使用Laravel,与PDO连接。如果转出的值在绑定中是正确的。一旦执行,它们在DB中就不同了。我已经尝试将数据库从MariaDB更改为MySQL,以查看它是否是导致它的数据库。一切都指向它是PDO。

在使用完全相同版本的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

该表格为InnoDB,编码为UTF-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,

我可以尝试解决我的问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我们的服务器使用的是常规php70-mysql驱动程序,而不是本机驱动程序php70-mysqlnd。一旦我们更新了整数就被保留了。