SQlite: Формат столбца для метки времени Unix; Целые типы

Исходная проблема: Каков формат правого столбца для метки времени Unix?

Сеть полна беспорядка: некоторые сообщения утверждают, что SQLite не имеет никаких неподписанных типов - или безотносительно, или за исключением международного типа на 64 бита (но существует (противо-) примеры, которые вызывают UNSIGNED INTEGER). Страница типов данных упоминает это только в bigint примере. Это также утверждает, что существует 6-байтовое целое число, но не дает название его. Кажется, что мои попытки с ЦЕЛЫМ ЧИСЛОМ, являющимся 4 байтами, подписали подписанные метки времени Unix хранилища как отрицательные числа. Я услышал, что некоторые системы возвращают 64-разрядные метки времени также. OTOH я не слишком люблю трату 4 байтов для хранения 1 дополнительного бита (главный бит метки времени), и даже если я должен выбрать больший формат данных, я пошел бы для 6 байтов один. Я даже видел сообщение, которое утверждает, что метка времени Unix SQLite имеет РЕАЛЬНЫЙ тип...

Полная проблема: кто-то мог разъяснить ту путаницу?

11
задан SF. 6 April 2010 в 09:39
поделиться

5 ответов

Размер целого числа

Все столбцы в базах данных SQLite имеют внутреннюю переменную ширину. Формат файла хранит целые числа в 1, 2, 3, 4, 6 или 8 байтах, в зависимости от того, насколько велико число, плюс один байт в заголовке, чтобы указать размер. Таким образом, в целом даты Unix, хранящиеся в виде целых чисел, будут занимать 5 байтов до 19 января 2038 года и 7 байтов после этого.

С точки зрения пользователя C API, все целые числа являются 64-битными со знаком.

Тип столбца

Не имеет значения, объявляете ли вы свой столбец как INTEGER, UNSIGNED INTEGER, BIGINT или что-то еще. Все, что содержит "INT", имеет целочисленное сродство. И, как упоминалось выше, все целые числа являются 64-битными со знаком, но обычно не сохраняются таким образом.

12
ответ дан 3 December 2019 в 04:31
поделиться

Я бы предпочел 64-битное целое число. Классический случай 32-битного целого числа без знака - это секунды, так как 1970-01-01 заканчивается в 2038 году. См. http://en.wikipedia.org/wiki/Unix_time и http: //en.wikipedia.org/wiki/Year_2038_problem. С 64-битным целым числом без знака вы в безопасности

0
ответ дан 3 December 2019 в 04:31
поделиться

Не могли бы вы привести пример того, что вы имеете в виду, говоря «Кажется, мои попытки с INTEGER представляют собой 4-байтовые подписанные подписанные временные метки unix в виде отрицательных чисел»?

Если вы еще этого не сделали, я бы посоветовал прочитать документацию SQLite по типам данных (раздел 1.2 Тип данных даты и времени) и функциям даты и времени .

0
ответ дан 3 December 2019 в 04:31
поделиться

Если вы используете встроенную систему, где ситуация с памятью критическая, вы можете рассмотреть возможность снижения точности, сдвинув 64-битное значение на несколько бит (что приведет к точность 2, 4, 8 ... секунд вместо 1 секунды) и использование 32-битного значения для его хранения.

0
ответ дан 3 December 2019 в 04:31
поделиться

SQLite не имеет беззнаковых типов. Это следует непосредственно из слов главного автора, а также из документации. Более того, у него нет фиксированной ширины столбцов для целых чисел; фактическая ширина на диске - это деталь реализации.

SQLite не имеет типа данных даты или времени. Однако в нем есть функции даты, которые могут работать со строками ISO8601 (TEXT), числами юлианского дня (REAL) и временными метками Unix (INTEGER).

Так что если вы решите сделать ваше поле времени временной меткой Unix, знайте, что оно может хранить до до 64-битных знаковых целых чисел, но значения, которые вы храните сейчас, должны фактически занимать 32 бита на диске, даже если исходное значение является 64-битным time_t.

12
ответ дан 3 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: