我尝试将PHP浮点值63.59072952118762存储到postgres中的双精度列中。 Postgres将该值存储为63.59073。有谁知道为什么?对于该值,8字节应该足够了。我尝试过使用数据类型numeric,它在指定精度时起作用,但实际上并不是必需的。
更新:尝试存储63.5907295时会出现同样的问题,因此建议在存储之前发生双重问题似乎是现实的。
更新II(部分解决):我指定double参数的行如下所示:
$stmt->bindParam(4, $this->latitude);
我不知道的是PDO将其param类型默认为string。我把它更改为PDO :: PARAM INT缺少更好的替代方案(PARAM DOUBLE不是一个选项),并且在postgres中存储的double中得到10位精度(至少有一些进展)。我已经检查过数字类型是否运行良好,所以看起来数字是使用PDO时的方法,双精度必须具有超过10位小数的精度。
无论如何,正如有人提到的那样,我不知道这是否必须具备这种精确度,但我认为这个问题本身值得研究。
答案 0 :(得分:2)
PHP和PostgreSQL之间的路径上有很多很多地方可能会混淆如何表示数据。
解释如何将数据插入DBMS非常重要。在INSERT语句中使用文字值会导致使用绑定参数的一组不同问题。如果你在SQL中写出了值:
INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);
并且数据被截断,你在PostgreSQL中遇到了问题。如果绑定变量,则必须确保理解PHP和PDO PostgresSQL模块对该值的作用 - 它是以double形式发送还是作为字符串发送,以及哪些代码处理转换,等等。 / p>
你遇到与Perl + DBI + DBD :: YourDBMS(在你的情况下是DBD :: Pg)类似的问题。
答案 1 :(得分:1)
如果您需要那么多精确度,请考虑使用DECIMAL/NUMERIC类型
答案 2 :(得分:0)
PostgreSQL接受float(1)到float(24)选择真实类型,而float(25)到float(53)选择双精度。
在大多数平台PG上,实际类型的范围至少为1E-37到1E + 37,精度至少为6位小数。双精度类型的范围通常为1E-307到1E + 308,精度至少为15位(REF)
你使用哪一个?