2011-02-22 73 views
3

我创建一个表,并通过执行以下在ARM Linux机器Linux和OS X上的Sqlite数据文件不兼容?

~ # sqlite3 /mnt/mmc/test.db 
SQLite version 3.6.12 
sqlite> create table a (d); 
sqlite> insert into a values (1.5); 
sqlite> select * from a; 
1.5 

我然后将文件传输到我的Mac和执行填充以下

themac:~ me$ sqlite3 test.db 
SQLite version 3.6.12 
sqlite> select * from a; 
5.30239915051991e-315 

Whaaat?我认为数据文件是独立于平台的。

+0

以任何机会是在Mac旧的竞价排名模式? (即big endian) – Coxy 2011-02-23 00:34:34

+0

对于它的价值,我只是测试了从x86 linux机器到x86 OS X机器的完全相同的指令序列,并选择了返回值1.5。 – Coxy 2011-02-23 00:41:19

+0

这是一种新型的英特尔Mac Book Pro(2-3岁)。 – Johnny 2011-02-23 05:22:09

回答

5

我对SQLite没有特别的了解,但是这表示64位IEEE 754格式double的两个32位字被交换时出现问题,如您在此示例中所看到的(使用gcc在x86机器)上:

$ cat test.c 
#include <stdio.h> 

int main(void) 
{ 
    union { 
     double d; 
     unsigned long long ull; 
    } u; 

    u.d = 1.5; 
    printf("%016llx\n", u.ull); 

    u.d = 5.30239915051991e-315; 
    printf("%016llx\n", u.ull); 

    return 0; 
} 
 
$ gcc -Wall -o test test.c 
$ ./test 
3ff8000000000000 
000000003ff80000 
$ 
0

的文件格式是平台独立的,至少根据http://www.sqlite.org/onefile.html

SQLite中数据库是一个单一的磁盘 文件。此外,文件格式是跨平台的 。在一台机器上创建的数据库 可以复制 ,并在具有不同架构的不同机器上使用。 SQLite 数据库可跨32位 和64位机器以及 大端和小端 体系结构进行移植。

在传输过程中文件是否损坏?你能在两种环境下运行md5sum并确认文件是否相同?

+2

分别在ze Linux(“md5sum”)和Mac(“md5”)上:b7b8210c3a8bcc3e59359feea6301a68和b7b8210c3a8bcc3e59359feea6301a68。他们是一样的。 – Johnny 2011-02-22 22:32:23

+1

它看起来像我在sqlite中的错误。他们的错误报告页面在这里:http://www.sqlite.org/src/wiki?name=Bug+Reports 对不起,我不能更有帮助。 – 2011-02-23 00:55:42