SQLite真的是跨平台的吗?

6

我正在使用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

第三和第四列的类型为REAL。有趣的事实是:当数字为整数(即以“.0”结尾)时,两个数据库之间没有区别。在其他所有情况下,它们的差异是...嗯...令人惊讶?我似乎找不到规律。
如果有人知道,请分享!
注:sqlite3 -version 输出 Debian: 3.6.21 (lenny-backports) Mac OS X: 3.6.12 (10.6)

1
我也找不到规律。它不是字节交换。 - dan04
2个回答

3
在SQLite的版本3.4.0中增加了一个编译时标志:SQLITE_MIXED_ENDIAN_64BIT_FLOAT,以支持具有怪异字节顺序的ARM7处理器。我在使用Arm920Tid设备和基于x86的虚拟机时遇到了同样的问题。Arm设备正在写入数据,而我正在尝试在x86虚拟机(或我的Mac)上读取它。将此编译时标志添加到我的arm构建的makefile中后,无论在哪个平台上查询数据库,我都能获得合理的值。供参考,我正在使用sqlite 3.7.14。

2
应该是,文件格式 表明 REAL 存储为大端序格式,如果两个构建正确序列化,则不受体系结构影响。

数据库记录头中存储的值 7 表示相应的数据库值是 SQL 实数(浮点数)。在这种情况下,数据块包含一个 8 字节的 IEEE 浮点数,以大端序字节顺序存储。


我很欣慰它应该是跨平台的,但我想知道是什么原因导致我的sqlite数据库出现这些差异。 - pruefsumme
2
可能是实现中的一个错误。 - ta.speot.is

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接