【问题标题】:PHP returns floats instead of strings from a database?PHP从数据库返回浮点数而不是字符串?
【发布时间】:2012-06-04 00:59:37
【问题描述】:

我使用它为我商店中的每个产品创建一个唯一代码,

echo base_convert(uniqid(),16,10);

例如,

1403802682572650

我的查询很简单,

        $sql = "
            SELECT * 
            FROM page AS p

            LEFT JOIN stock AS o
            ON o.id = p.page_id

            WHERE p.type = ?
            AND p.hide != ?
            ORDER BY p.backdated_on
        ";

当我想获取产品代码时,我会这样做,

var_dump($product->code);

但是 PHP 返回 float(1.4038026825726E+15) 而不是 1403802682572650

为什么 PHP 返回 float 而不是 string?我怎样才能得到原来的号码?

或者在从 db 表请求结果之前,我应该在我的 SQL 查询中将数字转换/转换为字符串或 varchar 吗?

编辑: 在我的代码中发现了错误。

例如,我有一行将 json 转换为数组并将字符串转换为浮点数,

echo json_decode("1403802682572650", true); // 1.4038026825726E+15

【问题讨论】:

  • 码表字段的数据类型是什么?
  • varchar(255) utf8_general_ci 所以应该没问题吧?
  • 数字太大:php > echo 1403804750765990; // 1.403804750766E+15

标签: php mysql floating-point base-conversion unique-id


【解决方案1】:

值超出范围。

PHP 人:

整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)。 64 位平台的最大值通常约为 9E18。 PHP 不支持无符号整数。自 PHP 4.4.0 和 PHP 5.0.5 起,可以使用常量 PHP_INT_SIZE 确定整数大小,使用常量 PHP_INT_MAX 确定最大值。

如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致数字超出整数类型范围的操作将改为返回浮点数。

【讨论】:

  • 字符串超出范围?不这么认为。
  • 不知何故,它被转换为int,然后解释为float。我猜它发生在你的数据库对象中。
  • 是的,一定是其他原因造成的!
  • 发现了错误,请看我上面的编辑 - echo json_decode("1403802682572650", true); // 1.4038026825726E+15
  • 显然,您不需要解码不是 JSON 的字符串。
【解决方案2】:

没有。您应该将列本身更改为 VARCHAR,因为它真的没有被用作数字。

【讨论】:

  • db表列设置为varchar(255) utf8_general_ci我看不到错误在哪里...
  • 验证数据在当时没有被炒掉。
【解决方案3】:

您可以在不对数据库架构进行可能有害的更改的情况下执行以下两项操作之一。

你可以先输入 cast $product->code:

var_dump( (string) $product->code );

或者您可以转换/转换查询中的选择:

SELECT CAST(columnName as char) as code ...

如果数据库引擎不支持您的查询,我一直喜欢通过代码而不是查询来处理大多数此类更改。

【讨论】:

  • 谢谢。我试图在查询中强制选择,但我仍然将数字作为浮点数 - 1.403804750766E+15....
  • 我正在使用 PHP PDO,这行可能会导致这个问题,-$this->connection = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  • 在我的脚本中发现了错误。它是由json_decode 引起的。感谢您的帮助。
猜你喜欢
  • 2014-07-02
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多