我正在使用SQLite来存储一些数据。主数据库位于NAS(Debian Lenny,2.6.15,armv4l)上,因为NAS运行的脚本每天都会更新数据。典型的“select * from tableX”如下所示:
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)并运行相同的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”结尾)时,两个数据库之间没有区别。在所有其他情况下,差异是......嗯......令人惊讶?我似乎无法找到一种模式。
如果有人有线索 - 请分享!
PS:sqlite3 -version输出 Debian:3.6.21(lenny-backports) Mac OS X:3.6.12(10.6)
答案 0 :(得分:3)
在SQLite的版本3.4.0中添加了编译时标志。
- 添加了SQLITE_MIXED_ENDIAN_64BIT_FLOAT编译时选项,以支持具有高端字节顺序的ARM7处理器。
我遇到了与Arm920Tid设备和基于x86的VM相同的问题。 arm设备正在写数据,我试图在x86 VM(或我的Mac)上读取它。
在我的arm文件中添加这个编译时标志后,我可以在任一平台上查询数据库时获得合理的值。
供参考我使用的是sqlite 3.7.14
答案 1 :(得分:2)
应该是,file format表示REAL以big-endian格式存储,如果两个版本都正确序列化,这将是架构不变的。
存储在数据库记录头中的值7表示相应的数据库值是SQL实数(浮点数)。在这种情况下,数据blob包含一个8字节的IEEE浮点数,以big-endian字节顺序存储。