SQLite действительно кросс-платформенный? - PullRequest
6 голосов
/ 03 января 2011

Я использую 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-версии Debian: 3.6.21 (lenny-backports) Mac OS X: 3,6.12 (10,6)

Ответы [ 2 ]

3 голосов
/ 12 сентября 2012

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

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

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

После добавления этого флага времени компиляции в мой make-файл для сборки руки я смог получитьнормальные значения, когда я запрашивал БД на любой платформе.

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

2 голосов
/ 03 января 2011

Должно быть, формат файла говорит, что REAL хранится в формате с прямым порядком байтов, который будет архитектурно-инвариантным, если сериализован правильно в обеих сборках.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...