SQlite: формат столбцов для временной метки unix; Целочисленные типы

Исходная проблема: Каков правильный формат столбца для отметки времени unix?

Сеть полна путаницы: некоторые сообщения утверждают, что SQLite не имеет беззнаковых типов - либо вообще, либо за исключением 64-битного типа int (но есть (встречные) примеры, которые вызывают UNSIGNED INTEGER). Страница типов данных упоминает его только в примере bigint. Он также утверждает, что существует 6-байтовое целое число, но не дает имени для него. Кажется, что мои попытки с INTEGER состоят из 4-байтовых подписанных отметок timestamps в хранилище unix как отрицательных чисел. Я слышал, что некоторые системы также возвращают 64-битные метки времени. OTOH Я не слишком люблю тратить 4 байта, чтобы сохранить 1 дополнительный бит (верхний бит временной метки), и даже если мне нужно выбрать больший формат данных, я предпочел бы пойти на 6-байтовый. Я даже видел сообщение, которое утверждает, что временная метка SQLite unix имеет тип REAL...

Полная проблема: Может кто-то прояснить этот беспорядок?

Ответ 1

Размер целого

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

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

Тип столбца

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

Ответ 2

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

SQLite не имеет типа даты или времени. Тем не менее, он имеет функции даты, которые могут работать с строками ISO8601 (TEXT), номерами Julian day (REAL) и временными отметками Unix (INTEGER).

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

Ответ 3

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

Ответ 4

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

Если вы еще не предложили читать документы SQLite на datatypes (раздел 1.2 Дата и тип времени) и функции даты и времени.

Ответ 5

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