2016-09-29 223 views
2

我想查询针对MSSQL数据库上BIGINT主键和一些返回的值调高圆润,比存储在数据库中的有所不同:PDO MSSQL - 错BIGINT返回值

See screenshot here

9200000000000359存在于DB以及9200000000000361中。查询这两个值中的任何一个都会返回9200000000000360(注意:该值在数据库中不存在)。

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

有什么设置可以在SQLServer或php.ini配置中获得正确的值吗?

+0

奇怪的是,什么是'串(16)'? – 2016-09-29 07:46:29

+0

如果你在你的16位整数周围加上单引号“'”,会发生什么? – Abela

+0

@Abela我不认为它可能会改变一件事情,因为两者都是字符串。编辑:顺便说一句,是一个输出字符串,你不能改变引号。 – 2016-09-29 07:47:30

回答

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" 
} 
0

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

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

PHP Manual

x86_64的构建 是x64构建PHP 5中为Windows是实验性的,并没有提供64位整数或大文件支持。

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

windows.php.net

+0

在本地macOS Sierra上的PHP 7.0.11和CentOS 64位服务器上的PHP 5.6.25(CentOS版本6.7/Linux 2.6.32-573.el6.x86_64)上都会出现此问题。 –