PDO MSSQL - 返回错误的BIGINT值

时间:2016-09-29 07:43:01

标签: php sql-server pdo bigint

我正在尝试查询MSSQL数据库上的BIGINT主键,并且一些返回值会四舍五入,与数据库中存储的值不同:

See screenshot here

数据库中存在<9 >000000000359,以及9200000000000361。查询这两个值中的任何一个都将返回9200000000000360(旁注:数据库中不存在此值)。

似乎首先(错误地)将值转换为二进制,并且当转换回来时,它们导致与原始值不同的值。但我在64位机器上使用PHP 5.6,而不是32位。当使用dblib和odbc驱动程序时也会发生这种情况。

我可以在SQLServer或php.ini配置中进行任何设置以获取正确的值吗?

2 个答案:

答案 0 :(得分:0)

如果您在Windows下使用PHP,则应升级到PHP 7 +。

  

64位平台的最大值通常约为9E18,除了   Windows 7之前的Windows,它总是32位。

来自PHP Manual

  

x86_64构建   用于Windows的PHP 5的x64版本是实验性的,不提供64位整数或大文件支持。

     

PHP 7提供完整的64位支持。 PHP 7的x64版本支持本机64位整数,LFS,memory_limit等等。

来自windows.php.net

答案 1 :(得分:0)

似乎Yii在结果上进行浮动转换。即使是64位机器上的普通PHP 7也会返回以下输出:

php > echo (int)(float)9200000000000359;
9200000000000360

使用普通的PHP和PDO,返回正确的输出:

$db = new PDO($dbc->connectionString, $dbc->username, $dbc->password);
$stmt = $db->query("...... WHERE id = 9200000000000359");
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)[0]['id']);

// output:
array(1) {
    [0] => string(16) "9200000000000359"
}