2009-11-15 83 views
4

我遇到了这个非常恼人的行为,我想知道我是否做错了什么,或者如果这是故意的(如果是这样,为什么)。通过PDO在MySQL中插入双精度时的精确损失

每当我在php(5.3)中有一个类型为double的变量,并且想要将它插入到类型为double的字段中的数据库(MYSQL 5.0)中时,该值总是舍入到6位数当我使用PDO的时候。所以下面的代码:

$stmt = $pdo->prepare("UPDATE someTable SET someDouble = :somePHPDouble;"); 
$number = 0.11124379542256; 
$stmt->bindValue(':somePHPDouble', $number); 
$stmt->execute(); 

结果在0.111244插入db。但是,当我在绑定表达式转换的变量为一个字符串像(!):

$stmt->bindValue(':somePHPDouble', (string)$number); 

它正确地插入它为0.11124379542256。

这里发生了什么?我无能为力。 someDouble的MySQL数据类型实际上是一个double类型,当它通过mysql控制台插入时它就可以工作。而在PHP中的变量真的是一个双重的,所以在我看来,PDO内出现问题。

在此先感谢, -CodePoet。

+0

您是否尝试明确指定PDO :: PARAM_FLOAT?像: '$ stmt-> bindValue(':somePHPDouble',$ number,PDO :: PARAM_FLOAT);' – intgr 2009-11-15 17:22:44

+0

PDO没有指定一个名为PARAM_FLOAT的常量。据了解,当客户端代码省略最终参数时,表明该参数将被视为浮点数: http://www.php.net/manual/en/pdo.constants.php – CodePoet 2009-11-17 18:41:47

回答

6

既不是故意的,也不是你做错了什么。这似乎是一个PHP错误。

根据this bug report,它已被修正为PHP 5.2.11,但只是最近的5.3分支,所以你可能想检查你的确切的PHP版本与那里提到的。

+1

非常感谢亨里克!我找不到那个错误报告,你的GoogleFu> Mine。 – CodePoet 2009-11-15 17:34:52