12

元の問題: UNIX タイムスタンプの正しい列形式は何ですか?

ネットは混乱に満ちています: 一部の投稿では、SQLite には unsigned の型がないと主張しています。データ型のページでは、bigint の例でのみ言及されています。また、6 バイトの整数があると主張していますが、その名前は示していません。INTEGER を 4 バイトの署名付きストア unix タイムスタンプとして負の数値として試してみたようです。一部のシステムは 64 ビットのタイムスタンプも返すと聞いたことがあります。OTOH 余分な 1 ビット (タイムスタンプの最上位ビット) を保存するために 4 バイトを浪費するのはあまり好きではありません。SQLite unix タイムスタンプが REAL 型であると主張する投稿も見たことがあります...

完全な問題: 誰かがその混乱を明確にしてくれませんか?

4

5 に答える 5

13

整数のサイズ

SQLite データベースのすべての列は、内部的に可変幅です。このファイル形式では、数値の大きさに応じて、整数が 1、2、3、4、6、または 8 バイトで格納され、サイズを示すためにヘッダーに 1 バイトが追加されます。つまり、整数として格納された Unix 日付は、2038 年 1 月 19 日までは 5 バイト、それ以降は 7 バイトを使用します。

C API のユーザーから見ると、すべての整数は 64 ビットで署名されています。

列タイプ

列を INTEGER、UNSIGNED INTEGER、BIGINT などと宣言するかどうかは問題ではありません。 「INT」が含まれているものはすべて、整数の親和性があります。 そして、前述のように、すべての整数は 64 ビット符号付きですが、通常はそのように格納されません。

于 2010-04-07T04:47:57.500 に答える
13

SQLiteには符号なしの型はありません。これは、主な作成者とdocsから直接入手したものです。さらに、整数の列幅は固定されていません。実際のディスク上の幅は実装の詳細です。

SQLite には、日付または時刻のデータ型がありません。ただし、ISO8601 文字列 (TEXT)、ユリウス日番号 (REAL)、および Unix タイムスタンプ (INTEGER) を操作できる日付関数があります。

そのため、時刻フィールドを Unix タイムスタンプにすることに決めた場合は、最大64 ビットの符号付き整数を格納できることを知っておいてください。ただし、ソース値が 64 ビットのtime_t.

于 2010-04-07T03:32:47.247 に答える
0

メモリ状況が重要な組み込みシステムを使用している場合は、64 ビット値を数ビットシフトして精度を下げることを検討できます (結果として、1 秒ではなく 2、4、8 秒の精度になります)。 32 ビット値を使用して格納します。

于 2010-04-06T10:14:43.823 に答える
0

私の好みは64ビット整数です。符号なし 32 ビット整数の典型的なケースは、1970 年 1 月 1 日から 2038 年までの秒数です。http://en.wikipedia.org/wiki/Unix_timeおよびhttp://en.wikipedia.org/wikiを参照してください。 /Year_2038_problem . 64 ビットの符号なし整数を使用すると、安全です

于 2010-04-06T09:49:00.057 に答える
0

「INTEGER が 4 バイトの署名付きストア UNIX タイムスタンプを負の数として使用しようとしているようです」という意味の例を挙げていただけますか?

まだ読んでいない場合は、データ型に関する SQLite ドキュメント(セクション 1.2 日付と時刻のデータ型) と日付と時刻の関数を読むことをお勧めします。

于 2010-04-06T10:04:36.090 に答える