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

标签 php mysql pdo

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

这不会发生在我使用完全相同版本的 PHP 7.0.15 的本地开发机器上。我在开发或本地都没有错误。

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

我找到了 this bug report从 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

该表是 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,

我可以尝试哪些事情来解决我的问题?

最佳答案

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

关于php - 使用 PDO 将整数从 64 位转换为 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817273/

相关文章:

php - 如何使用来自 HTML 表单的输入制作 PHP 计算器,但又让它立即给出结果?

php - 如何显示mysql数据库中的图像?

php - SQL 查询和 PHP

php - Mysql根据字段获取三组行

php - 升级到 PHP 7 后的 Mysql PDO automagic utf8 转换

php - 为什么 Symfony2 日志文件指定的时间与服务器时间不同?

php - 在 WooCommerce 中先显示当前类别,然后显示子类别

php - 使用 Eloquent 从 Laravel 5 中的 Blade 运行选择查询的正确方法

php - PDO 期望显示所有结果,但只显示一个

php - PDO - array_map 返回键中的对象 ID