繁体   English   中英

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

[英]Integers being converted from 64bit to 32bit with PDO

我在我们的mysql数据库中存储了64位Facebook ID。 当我查看数据库表时,值是32位。 我正在使用带有PDO连接的Laravel。 如果转储了这些值,则它们在绑定中是正确的。 一旦执行,它们在数据库中将有所不同。 我尝试将数据库从MariaDB更改为MySQL,以查看是否是引起它的数据库。 一切都表明它是PDO。

在使用完全相同版本的PHP 7.0.15本地开发计算机上,不会发生这种情况。 我在开发或本地方面都没有错误。

MySQL和PHP是64位版本。 我找不到能帮助我解决问题的任何东西。

我发现2013年的此错误报告清楚地说明了我的问题,但似乎已解决。

在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

该表是具有UTF-8 Unicode编码的InnoDB ,排序规则是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,

我可以尝试解决什么问题?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM