通过 PDO 将双精度数插入 MySQL 时精度损失
我遇到了这种非常烦人的行为,我想知道我是否做错了什么,或者这是否是故意的(如果是的话,为什么)。
每当我在 php (5.3) 中有一个 double 类型的变量,并且想将其插入到数据库 (MYSQL 5.0) 的 double 类型字段中时,该值总是向下舍入到点后面的 6 位数字我正在使用 PDO。所以下面的代码:
$stmt = $pdo->prepare("UPDATE someTable SET someDouble = :somePHPDouble;");
$number = 0.11124379542256;
$stmt->bindValue(':somePHPDouble', $number);
$stmt->execute();
结果 0.111244 插入到数据库中。但是,当我将变量转换为绑定表达式中的字符串(!)时,例如:
$stmt->bindValue(':somePHPDouble', (string)$number);
它会将其正确插入为 0.11124379542256。
这里发生了什么事?我一无所知。 MySQL 数据类型 someDouble 实际上是双精度型,当通过 mysql 控制台插入它时它就可以工作。而且php中的变量确实是一个double,所以在我看来PDO内部出了问题。
提前致谢, -代码诗人。
I've run into this really annoying behavior and I want to know if I'm doing something wrong, or if this is intentional (and if so, why).
Whenever I have a variable in php (5.3) that is of type double and I want to insert it into the database (MYSQL 5.0) in a field that is of type double, the value always gets rounded down to 6 digits behind the point when I'm using PDO. So the below code:
$stmt = $pdo->prepare("UPDATE someTable SET someDouble = :somePHPDouble;");
$number = 0.11124379542256;
$stmt->bindValue(':somePHPDouble', $number);
$stmt->execute();
Results in 0.111244 inserted into the db. But when I cast the variable to a string(!) in the binding expression like:
$stmt->bindValue(':somePHPDouble', (string)$number);
it inserts it properly as 0.11124379542256.
What is happening here ? I'm clueless. MySQL datatype of someDouble really is a double, and when inserting it through mysql console it just works. And the variable in php really is a double, so it seems to me that something goes wrong inside PDO.
Thanks in advance,
-CodePoet.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这既不是故意的,也不是你做错了什么。这似乎是一个 PHP 错误。
根据此错误报告,它已在 PHP 5.2.11 中修复,但是最近才发布 5.3 分支,因此您可能需要根据其中提到的版本检查您的确切 PHP 版本。
It is neither intentional, nor are you doing something wrong. It seems to be a PHP bug.
According to this bug report, it has been fixed for PHP 5.2.11, but only recently for the 5.3 branch, so you might want to check your exact PHP version against the ones mentioned there.