2010-04-06 10 views
10

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

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

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

ответ

12

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

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

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

Тип столбца

Это не имеет значения, объявить ли ваш столбец как INTEGER, UNSIGNED INTEGER, BIGINT, или любой другой.Anything with "INT" in it has integer affinity. И, как упоминалось выше, все целые числа подписаны 64-битными, но обычно не сохраняются таким образом.

+0

Спасибо. Это действительно не помогает в том, что различие между четырьмя: int-именами «синтаксический сахар», целыми числами C (плюс внутреннее представление) и дисковым хранением чисел четко не подчеркнуты в различных документах, а различные значения и имена даны без много контекста. Ваш ответ объясняет разницу и специфику каждого и позволил мне реально понять структуру системы. –

0

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

+0

Тем не менее, даже 48-бит будет намного более чем достаточным, и это встроенная система, 2-4 избыточных байта в строке намного больше, чем я хочу свободно отказаться. –

0

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

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

+0

http://stackoverflow.com/questions/2401804/negative-dates-in-sqlite –

0

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

+0

В качестве альтернативы, если ваши данные охватывают диапазон менее 194 дней, вы можете использовать более новую эпоху, чтобы количество секунд занимало всего 3 байта вместо 4. – dan04

11

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

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

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

+0

Если бы я мог принять два ответа, ваше и Дэн бы это было. –