Почему postgresql не сохраняет все мое значение с плавающей запятой (PHP)?
-
12-09-2019 - |
Вопрос
Я пытаюсь сохранить значение PHP с плавающей запятой 63.59072952118762 в столбце двойной точности в postgres.Postgres сохраняет значение как 63,59073.Кто-нибудь знает, почему?8 байт должно быть более чем достаточно для этого значения.Я пробовал использовать числовой тип данных, который работает при указании точности, но в этом нет необходимости.
Обновлять: Та же проблема возникает при попытке сохранить 63.5907295, поэтому предположение, что с двойником что-то произойдет до того, как оно будет сохранено, кажется реалистичным.
Обновление II (частично решено):Строка, в которой я присваиваю параметр double, выглядит следующим образом:
$stmt->bindParam(4, $this->latitude);
Чего я не знал, так это того, что PDO по умолчанию устанавливает тип параметра в строку.Я изменил его на PDO::PARAM INT из-за отсутствия лучшей альтернативы (PARAM DOUBLE не был вариантом) и получил точность 10 цифр в двойном значении, хранящемся в postgres (по крайней мере, некоторый прогресс).Я проверил, что числовой тип работает хорошо, поэтому кажется, что числовой тип — это лучший вариант при использовании PDO и двойных чисел, которые должны иметь точность более 10 десятичных знаков.
В любом случае, как кто-то заметил, я не знаю, необходима ли мне такая точность, но я думаю, что проблема сама по себе заслуживает изучения.
Решение
- Как определить, что хранит PostgreSQL?
- Как отправить данные в PostgreSQL?
- Как вернуть данные обратно?
- Как вы это показываете?
- Какого типа столбец в базе данных?
На пути между PHP и PostgreSQL существует много-много мест, где может возникнуть путаница в отношении представления данных.
Важно объяснить, как данные вставляются в СУБД.Использование буквального значения в инструкции INSERT приводит к иному набору проблем, чем использование связанных параметров.Если вы записали значение в SQL:
INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);
и данные были усечены, у вас возникнут проблемы в PostgreSQL.Если вы привязываете переменную, вы должны быть уверены в том, что модули PHP и PDO PostgresSQL делают со значением — отправляется ли оно как двойное значение или как строка, какой код занимается преобразованием и так далее.
Вы сталкиваетесь с аналогичными проблемами с Perl + DBI + DBD::YourDBMS (DBD::Pg в вашем случае).
Другие советы
Рассмотрите возможность использования ДЕСЯТИЧНЫЙ/ЦИФРОВОЙ введите, если вам нужна такая точность
PostgreSQL принимает значения от float(1) до float(24) как выбор реального типа, а от float(25) до float(53) выбирает двойную точность.
На большинстве платформ PG реальный тип имеет диапазон от 1E-37 до 1E+37 с точностью не менее 6 десятичных цифр.Тип двойной точности обычно имеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр (ССЫЛКА)
Какой из них вы используете?