2011-01-03 22 views
6

Estoy usando SQLite para almacenar algunos datos. La base de datos primaria está en un NAS (Debian Lenny, 2.6.15, armv4l) ya que el NAS ejecuta un script que actualiza los datos todos los días. Un típico "seleccionar * de TABLEX" tiene el siguiente aspecto:¿SQLite es realmente multiplataforma?

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 

Cuando copio la base de datos al ordenador principal (Mac OS X) y ejecutar la misma consulta SQL, la salida es:

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 

La tercera y cuarta columna tienen el tipo REAL. Dato interesante: cuando los números son enteros (es decir, terminan con ".0"), no hay diferencia entre las dos bases de datos. En todos los demás casos, las diferencias son ... hm ... ¿Sorprendente? Parece que no puedo encontrar un patrón.

Si alguien tiene una pista, ¡por favor comparta!

PS: sqlite3 salida -versión Debian: 3.6.21 (lenny-backports) Mac OS X: 3.6.12 (10,6)

+1

No puedo encontrar un patrón tampoco. NO es un intercambio de bytes. – dan04

Respuesta

3

En la versión 3.4.0 de SQLite, se agregó una marca de tiempo de compilación.

  • Agregado el SQLITE_MIXED_ENDIAN_64BIT_FLOAT opción para soportar procesadores ARM7 con endianness torpe en tiempo de compilación.

que estaba teniendo el mismo problema con un dispositivo Arm920Tid y mi máquina virtual basada en x86. El dispositivo de brazo estaba escribiendo los datos, y yo estaba tratando de leerlo en la máquina virtual x86 (o en mi Mac).

Después de agregar este indicador de tiempo de compilación a mi archivo MAKE para mi compilación de brazo, pude obtener valores en cuanto consulté la base de datos en cualquiera de las plataformas.

Como referencia estoy usando sqlite 3.7.14

+0

Genial, ¡eso realmente funcionó! – pruefsumme

2

Debe ser, el file format dice que el Real se almacena en grande- formato endian, que sería invariante de arquitectura si las compilaciones serializaran correctamente.

Un valor de 7 almacenado en el encabezado del registro de la base de datos indica que el valor de la base de datos correspondiente es un SQL real (número de coma flotante). En este caso, el blob de datos contiene un número de punto flotante IEEE de 8 bytes, almacenado en el orden de bytes de Big-Endian.

+0

Me tranquiliza que * deba * ser multiplataforma, pero me pregunto qué está causando estas diferencias en mi sqlite db. – pruefsumme

+2

Probablemente un error en la implementación. –