我在我们的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
该表是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,
我可以尝试解决我的问题?
什么是列类型? – AbraCadaver
该列是一个varchar(100)。我尝试了BIGINT,并且出现了超出范围的错误。 – brenjt
你必须展示你如何得到并回应它,因为它应该工作得很好,因为它们是字符串,除非你施放它们,计算它们等等...... – AbraCadaver