2011-01-03 2 views
6

私はいくつかのデータを格納するためにSQLiteを使用しています。 NASは毎日データを更新するスクリプトを実行するので、プライマリデータベースはNAS上にあります(Debian Lenny、2.6.15、armv4l)。典型的には、 "TABLEX SELECT * FROM" 次のようになります。SQLiteは実際にクロスプラットフォームですか?

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 

私は私のメインのコンピュータ(MacのOS X)にDBをコピーして、同じSQLクエリを実行すると、出力は次のとおりです。

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 

3番目と4番目の列のタイプはREALです。興味深い事実:数値が整数である場合(すなわち、「.0」で終わる)、2つのデータベース間に差はない。他のすべてのケースでは、違いは... hm ...驚くべきことですか?私はパターンを見つけることができません。

誰かが手がかりを持っている場合 - 共有してください!

PS:sqlite3の-version出力 のDebian:3.6.21(レニー-backportsの) のMac OS X:3.6.12(10.6)

+1

パターンが見つかりません。これはバイトスワッピングではありません。 – dan04

答えて

3

SQLiteのリリース3.4.0にコンパイル時フラグが追加されました。

  • は間抜けエンディアンとARM7プロセッサをサポートするためのSQLITE_MIXED_ENDIAN_64BIT_FLOATコンパイル時のオプションを追加しました。

Arm920Tidデバイスとx86ベースのVMで同じ問題が発生していました。アームデバイスがデータを書き込んでいましたが、x86 VM(またはMac)で読み込もうとしていました。

私のアームビルドのためにこのコンパイル時のフラグを自分のmakefileに追加した後、どちらのプラットフォームでもDBを照会すると正当な値を得ることができました。

参考のためにsqliteを使用しています。3.7.14

+0

偉大な、それは実際に働いた! – pruefsumme

2

それがあるべき、file formatはREALはビッグエンディアンで格納されていることを述べています両方のビルドで正しくシリアル化されていれば、アーキテクチャー不変型となります。

データベースレコードヘッダーに格納される値7は、対応するデータベース値がSQLの実数(浮動小数点数)であることを示します。この場合、データのBLOBには、ビッグエンディアンのバイトオーダーに格納された8バイトのIEEE浮動小数点数が含まれています。

+0

私はそれが*クロスプラットフォームであるべきだと安心していますが、私はsqlite dbでこれらの違いを引き起こしているのだろうかと思っています。 – pruefsumme

+2

おそらく実装のバグです。 –

関連する問題