2011-01-03 2 views
6

Я использую SQLite для хранения некоторых данных. Первичная база данных находится на NAS (Debian Lenny, 2.6.15, armv4l), поскольку NAS запускает скрипт, который обновляет данные каждый день. Типичным «выберите * из tableX» выглядит следующим образом:Действительно ли 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) и запустить тот же запрос 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»), между этими двумя базами нет разницы. Во всех остальных случаях различия ... хм ... удивительно? Я не могу найти шаблон.

Если у кого-то есть ключ - пожалуйста, поделитесь!

PS: sqlite3 выход -версия Debian: 3.6.21 (Lenny-Backports) Mac OS X: 3.6.12 (10,6)

+1

Я не могу найти шаблон. Это НЕ байтовая замена. – dan04

ответ

3

В выпуске 3.4.0 SQLite был добавлен флаг времени компиляции.

  • Добавлен SQLITE_MIXED_ENDIAN_64BIT_FLOAT время компиляции опции для поддержки процессоров ARM7 с бестолковыми байтами.

У меня была эта же проблема с Arm920Tid устройством и моей x86 на основе VM. Устройство руки записывало данные, и я пытался прочитать его на виртуальной машине x86 (или на моем Mac).

После добавления этого флага времени компиляции в мой файл makefile для моей сборки arm я смог получить разумные значения, когда я запросил DB на любой из платформ.

Для справки Я использую sqlite 3.7.14

+0

Отлично, это действительно сработало! – pruefsumme

2

Должно быть, то file format говорит, что РЕАЛЬНЫЙ хранится в big- endian, который был бы архитектурно-инвариантным, если бы сериализован правильно обе сборки.

Значение 7, сохраненное в заголовке записи базы данных, указывает, что соответствующее значение базы данных является реальным SQL (число с плавающей запятой). В этом случае блок данных содержит 8-байтовое число с плавающей точкой IEEE, , хранящееся в байтовом порядке байтов.

+0

Я рад, что он * должен * быть кросс-платформенным, но мне интересно, что вызывает эти различия в моем sqlite db. – pruefsumme

+2

Возможно, ошибка в реализации. –

Смежные вопросы