我正在尝试查询MSSQL数据库上的BIGINT主键,并且一些返回值会四舍五入,与数据库中存储的值不同:
数据库中存在<9 >000000000359,以及9200000000000361。查询这两个值中的任何一个都将返回9200000000000360(旁注:数据库中不存在此值)。似乎首先(错误地)将值转换为二进制,并且当转换回来时,它们导致与原始值不同的值。但我在64位机器上使用PHP 5.6,而不是32位。当使用dblib和odbc驱动程序时也会发生这种情况。
我可以在SQLServer或php.ini配置中进行任何设置以获取正确的值吗?
答案 0 :(得分:0)
如果您在Windows下使用PHP,则应升级到PHP 7 +。
64位平台的最大值通常约为9E18,除了 Windows 7之前的Windows,它总是32位。
x86_64构建 用于Windows的PHP 5的x64版本是实验性的,不提供64位整数或大文件支持。
PHP 7提供完整的64位支持。 PHP 7的x64版本支持本机64位整数,LFS,memory_limit等等。
答案 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"
}