为了显示我的问题,我提出了两个函数。第一个向Laravel询问PDO实例并查询数据库。在第二个我自己instanciate一个新的。 来自Laravel的第一个结果不准确。第二个给出正确的结果。Laravel 5.0 PDO从MySQL查询float会给出不准确的结果
表defenition会是这样的:
CREATE TABLE IF NOT EXISTS `event` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`level` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
这是第一个功能:
public function testpdo1() {
$pdo = DB::connection('myconnection')->getPdo();
$query = "SELECT level FROM event LIMIT 4";
$result = $pdo->query($query);
foreach ($result as $row) {
print $row[0] ."\n";
}
}
其中给出以下结果:
102.09999847412
97.900001525879
95.300003051758
94.099998474121
这是第二个功能:
public function testpdo2() {
$pdo = new PDO('dsn', 'user', 'pass');
$query = "SELECT level FROM event LIMIT 4";
$result = $pdo->query($query);
foreach ($result as $row) {
print $row[0] ."\n";
}
}
其中给出以下结果:
102.1
97.9
95.3
94.1
在最后的是正确的结果。
有没有办法让Laravel的行为像第二个功能?
我想差别在于PDO设置。我尝试设置PDO :: ATTR_STRINGIFY_FETCHES,但无济于事。我也在第二个函数中试过,看看我能否让第二个错误。但它没有奏效。
也许我做了一些错误的设置这样的属性。随着laravel(功能1)我试图/config/database.php将其设置为我的连接选项:
'connections' => [
'myconnection' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'options' => array (
PDO::ATTR_STRINGIFY_FETCHES => true,
),
],
....
与我
$pdo = new PDO('dsn', 'user', 'pass', [PDO::ATTR_STRINGIFY_FETCHES => true]);
,并试图将其与
第二功能$pdo->setAttribute (PDO::ATTR_STRINGIFY_FETCHES , true);
实例化后,有一个错误的值。它似乎没有任何区别...
这个问题接近我的问题:PHP PDO query returns inaccurate value for FLOAT fields 。但是由于我的第二个功能给出了正确的答案,似乎有可能得到准确的答案。
@Ragu Swaminathan建议第二个函数给出四舍五入的值。只是要清楚:那些是数据库中的值。
mysql> select level from event LIMIT 4;
+-------+
| level |
+-------+
| 102.1 |
| 97.9 |
| 95.3 |
| 94.1 |
+-------+
4 rows in set (0.00 sec)
当我在功能1查询中使用四舍五入的值将成为与从功能2.这是围绕一个可能的工作价值观,但我希望有一个更好的解决方案。
实际上第二个函数给你四舍五入的结果,而第一个给你的原始值..但两者似乎是相同的.. –