[英]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.