通过 PDO 将双精度数插入 MySQL 时精度损失

发布于 2024-08-11 09:02:08 字数 690 浏览 3 评论 0原文

我遇到了这种非常烦人的行为,我想知道我是否做错了什么,或者这是否是故意的(如果是的话,为什么)。

每当我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

剩一世无双 2024-08-18 09:02:08

这既不是故意的,也不是你做错了什么。这似乎是一个 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文