Ist SQLite wirklich plattformübergreifend?

Ich verwende SQLite, um einige data zu speichern. Die primäre database befindet sich auf einem NAS (Debian Lenny, 2.6.15, armv4l), da der NAS ein Skript ausführt, das die data jeden Tag aktualisiert. Ein typisches "select * from tableX" sieht folgendermaßen aus:

2010-12-28|20|62.09|25170.0 2010-12-28|21|49.28|23305.7 2010-12-28|22|48.51|22051.1 2010-12-28|23|47.17|21809.9 

Wenn ich die database auf meinen Hauptcomputer (Mac OS X) kopiere und dieselbe SQL-Abfrage ausführe, lautet die Ausgabe:

 2010-12-28|20|1.08115035175016e-160|25170.0 2010-12-28|21|2.39343503830763e-259|-9.25596535779558e+61 2010-12-28|22|-1.02951149572792e-86|1.90359837597183e+185 2010-12-28|23|-1.10707273937033e-234|-2.35343828462275e-185 

Die 3. und 4. Spalte haben den Typ REAL. Interessante Tatsache: Wenn die Zahlen ganzzahlig sind (dh sie enden mit ".0"), gibt es keinen Unterschied zwischen den beiden databaseen. In allen anderen Fällen sind die Unterschiede … hm … überraschend? Ich kann kein Muster finden.

Wenn jemand eine Ahnung hat – bitte teilen!

PS: sqlite3-Version Ausgabe Debian: 3.6.21 (Lenny-Backports) Mac OS X: 3.6.12 (10.6)

Solutions Collecting From Web of "Ist SQLite wirklich plattformübergreifend?"

In Release 3.4.0 von SQLite wurde ein Kompilierzeit-Flag hinzugefügt.

  • Die Option SQLITE_MIXED_ENDIAN_64BIT_FLOAT für die Kompilierungszeit wurde hinzugefügt, um ARM7-processoren mit Goofy-Endianz zu unterstützen.

Ich hatte das gleiche Problem mit einem Arm920Tid-Gerät und meiner x86-basierten VM. Das Armgerät schrieb die data und ich versuchte es auf der x86 VM (oder auf meinem Mac) zu lesen.

Nachdem ich diese Kompilierzeitflagge zu meinem Makefile für meinen Armaufbau hinzugefügt hatte, konnte ich vernünftige Werte erhalten, als ich die DB auf jeder Plattform anfragte.

Als reference verwende ich sqlite 3.7.14

Es sollte sein, dass das fileformat besagt, dass REAL im Big-Endian-Format gespeichert wird, was architekturinvariant wäre, wenn es von beiden Builds korrekt serialisiert würde.

Ein Wert von 7, der im Kopf des databasedatensatzes gespeichert ist, gibt an, dass der entsprechende databasewert eine SQL-reelle Zahl (Fließkommazahl) ist. In diesem Fall enthält der datablock eine 8-Byte-IEEE-Gleitkommazahl, die in Big-Endian-Byte-Reihenfolge gespeichert ist .