Почему postgresql не хранит все мои значения (PHP) с плавающей запятой? - PullRequest
0 голосов
/ 11 июля 2009

Я пытаюсь сохранить значение PHP с плавающей запятой 63.59072952118762 в столбце с двойной точностью в postgres. Postgres сохраняет значение как 63,59073. Кто-нибудь знает почему? 8 байт должно быть более чем достаточно для этого значения. Я пытался использовать числовой тип данных, который работает при указании точности, но в этом нет необходимости.

Обновление: Та же проблема возникает при попытке сохранить 63.5907295, поэтому предположение, что что-то происходит с двойным числом перед сохранением, кажется реалистичным.

Обновление II (частично решено) : строка, в которой я назначаю двойной параметр, выглядит следующим образом:

$stmt->bindParam(4, $this->latitude);

Чего я не знал, так это того, что PDO по умолчанию использует свой тип параметра - string. Я изменил его на PDO :: PARAM INT из-за отсутствия лучшей альтернативы (PARAM DOUBLE не был выбран) и получил точность 10 цифр в двойном значении, хранимом в postgres (по крайней мере, некоторый прогресс). Я проверил, что числовой тип работает хорошо, поэтому кажется, что при использовании PDO лучше всего использовать числовой тип, который должен иметь точность более 10 десятичных знаков.

В любом случае, как кто-то упоминал, я не знаю, должна ли я иметь такую ​​точность, но я думаю, что проблема сама по себе заслуживает изучения.

Ответы [ 3 ]

2 голосов
/ 11 июля 2009
  • Как вы определяете, что хранит PostgreSQL?
  • Как вы отправляете данные в PostgreSQL?
  • Как вернуть данные снова?
  • Как вы это отображаете?
  • Какой тип столбца в базе данных?

Существует множество путей на пути между PHP и PostgreSQL, где может возникнуть путаница в отношении представления данных.


Важно объяснить, как данные вставляются в СУБД. Использование литерального значения в операторе INSERT приводит к другому набору проблем по сравнению с использованием связанных параметров. Если вы записали значение в SQL:

INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);

и данные были усечены, у вас возникла проблема в PostgreSQL. Если вы связываете переменную, вы должны быть уверены, что понимаете, что PHP и модули PDO PostgresSQL делают со значением - отправляется ли оно как double или как строка, и какой код имеет дело с преобразованием и т. Д.

Вы столкнулись с аналогичными проблемами с Perl + DBI + DBD :: YourDBMS (DBD :: Pg в вашем случае).

1 голос
/ 11 июля 2009

Попробуйте использовать тип DECIMAL / NUMERIC , если вам нужна такая большая точность

0 голосов
/ 11 июля 2009

PostgreSQL принимает float (1) для float (24) в качестве выбора реального типа, в то время как float (25) для float (53) выбирает двойную точность.

На большинстве платформ PG реальный тип имеет диапазон от 1E-37 до 1E + 37 с точностью не менее 6 десятичных цифр. Тип двойной точности обычно имеет диапазон от 1E-307 до 1E + 308 с точностью не менее 15 цифр ( REF )

Какой из них вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...