【问题标题】:Precision loss whilst inserting a double into MySQL through PDO通过 PDO 将 double 插入 MySQL 时的精度损失
【发布时间】:2009-11-15 16:52:41
【问题描述】:

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

每当我在 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。

这里发生了什么?我一无所知。 someDouble 的 MySQL 数据类型确实是一个 double,当通过 mysql 控制台插入它时它就可以工作。而且php中的变量确实是double,所以在我看来PDO内部出了点问题。

提前致谢, -CodePoet。

【问题讨论】:

  • 您是否尝试过明确指定 PDO::PARAM_FLOAT?喜欢:$stmt->bindValue(':somePHPDouble', $number, PDO::PARAM_FLOAT);
  • PDO 未指定名为 PARAM_FLOAT 的常量。据了解,当客户端代码省略最后一个参数时,表示该参数将被视为浮点数:php.net/manual/en/pdo.constants.php

标签: php mysql pdo


【解决方案1】:

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

根据this bug report,它已针对 PHP 5.2.11 进行了修复,但最近才针对 5.3 分支进行了修复,因此您可能需要对照此处提及的版本检查您的确切 PHP 版本。

【讨论】:

  • 非常感谢亨利克!我找不到那个错误报告,你的 GoogleFu > Mine。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2014-08-13
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多