Frage

Ich versuche, den PHP -Gleitpunktwert 63.59072952118762 in eine Doppelgenauigkeitsspalte in Postgres zu speichern. Postgres speichert den Wert als 63,59073. Weiß jemand warum? 8 Byte sollte für diesen Wert mehr als genug sein. Ich habe es mit dem Datentyp Numeric ausprobiert, der bei der Angabe der Genauigkeit funktioniert, aber das sollte nicht wirklich notwendig sein.

Aktualisieren: Das gleiche Problem ist vorhanden, wenn versucht wird, 63.5907295 zu speichern. Der Vorschlag, dass etwas mit dem Doppel passiert, bevor es gespeichert wird, erscheint realistisch.

Update II (teilweise gelöst): Die Zeile, in der ich den doppelten Parameter zugewiesen habe, sieht folgendermaßen aus:

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

Das, was ich nicht wusste, ist, dass PDO seinen Paramyptyp für Zeichenfolge standardmäßig standhält. Ich habe es in PDO :: Param int im Fehlen einer besseren Alternative geändert (Param -Double war keine Option) und erhielt 10 Ziffern in den in Postgres gespeicherten Doppel (zumindest einige Fortschritte). Ich habe überprüft, ob der numerische Typ gut funktioniert, so dass numerisch der richtige Weg ist, wenn sie PDO und Doppel verwenden, die eine Präzision von mehr als 10 Dezimalstellen haben müssen.

Wie auch immer, ich weiß nicht, ob es ein Muss für mich ist, diese Art von Präzision zu haben, aber ich denke, das Problem an sich verdient es, untersucht zu werden.

War es hilfreich?

Lösung

  • Wie bestimmen Sie, was PostgreSQL speichert?
  • Wie senden Sie die Daten an postgresql?
  • Wie bringen Sie die Daten wieder zurück?
  • Wie zeigt man es?
  • Welchen Typ ist die Spalte in der Datenbank?

Es gibt viele, viele Orte auf dem Weg zwischen PHP und PostgreSQL, an denen es Verwirrung darüber geben könnte, wie die Daten dargestellt werden können.


Es ist wichtig zu erklären, wie Daten in die DBMs eingefügt werden. Die Verwendung eines wörtlichen Wertes in der Anweisung Insert führt zu unterschiedlichen Problemen als die Verwendung gebundener Parameter. Wenn Sie den Wert in der SQL ausgeschrieben haben:

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

Und die Daten wurden abgeschnitten, Sie hätten ein Problem in PostgreSQL. Wenn Sie die Variable binden, müssen Sie sicher sein, welchen PHP und die PDO -Postgressql -Module mit dem Wert tun - wird sie als Doppel oder als Zeichenfolge gesendet und welcher Code mit der Konvertierung usw.

Sie begegnen analoge Probleme mit Perl + DBI + DBD :: YourDBMS (DBD :: PG in Ihrem Fall).

Andere Tipps

Erwägen Sie, die zu verwenden Dezimal/numerisch Geben Sie ein, wenn Sie so viel Präzision benötigen

PostgreSQL akzeptiert Float (1), um (24) als Auswahl des realen Typs zu schweben, während Float (25) zum Schweben (53) doppelte Genauigkeit auswählen.

Auf den meisten Plattformen PG hat der reale Typ einen Bereich von mindestens 1E-37 bis 1e+37 mit einer Präzision von mindestens 6 Dezimalstellen. Der doppelte Präzisionstyp hat typischerweise einen Bereich von ca. 1E-307 bis 1E+308 mit einer Präzision von mindestens 15 Ziffern (Ref)

Welches benutzt du?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top