概要 :このチュートリアルでは、SQLiteデータ型システムと、ストレージクラス、マニフェスト型付け、型親和性などの関連する概念について学習します。
SQLiteデータ型の概要
MySQLやPostgreSQLなどの他のデータベースシステムを使用している場合は、静的型付けを使用していることに気付くでしょう。 。これは、特定のデータ型で列を宣言すると、その列には宣言されたデータ型のデータのみを格納できることを意味します。
他のデータベースシステムとは異なり、SQLiteは動的型システムを使用します 。つまり、列に格納されている値によって、列のデータ型ではなく、そのデータ型が決まります。
さらに、テーブルを作成するときに、列の特定のデータ型を宣言する必要はありません。整数データ型で列を宣言する場合、テキストやBLOBなど、あらゆる種類のデータ型を格納できます。SQLiteはこれについて文句を言いません。
SQLiteは、ストレージクラスと呼ばれる5つのプリミティブデータ型を提供します。
ストレージクラスは、SQLiteがデータをディスクに保存するために使用する形式を記述します。ストレージクラスは、データ型よりも一般的です(例:INTEGER
) ストレージクラスには、6種類の整数が含まれています。ほとんどの場合、ストレージクラスとデータ型は同じ意味で使用できます。
次の表は、SQLiteの5つのストレージクラスを示しています。
ストレージクラス | 意味 |
---|---|
NULL | NULL値は、情報が欠落しているか不明であることを意味します。 |
整数 | 整数値は整数(正または負)です。整数には、1、2、3、4、8バイトなどの可変サイズを指定できます。 |
本物 | 実数は、8バイトの浮動小数点数を使用する10進値の実数です。 |
テキスト | TEXTは、文字データを格納するために使用されます。 TEXTの最大長は無制限です。 SQLiteはさまざまな文字エンコードをサポートしています。 |
BLOB | BLOBは、あらゆる種類のデータを格納できるバイナリラージオブジェクトの略です。 BLOBの最大サイズは、理論的には無制限です。 |
SQLiteは、次のルールに従って、データ型に基づいて値のデータ型を決定します。
- リテラルに引用符と小数点または指数がない場合、SQLiteはINTEGERストレージクラスを割り当てます。
- リテラルが一重引用符または二重引用符で囲まれている場合、SQLiteはTEXTストレージクラスを割り当てます。
- リテラルに引用符、小数点、指数がない場合、SQLiteはREALストレージクラスを割り当てます。
- リテラルが引用符なしでNULLの場合、NULLストレージクラスが割り当てられます。
- リテラルにX'ABCD'またはx'abcd'がある場合、SQLiteはBLOBストレージクラスを割り当てました。
SQLiteは組み込みの日付と時刻のストレージクラスをサポートしていません。ただし、TEXT、INT、またはREALを使用して、日付と時刻の値を格納できます。日付と時刻の値を処理する方法の詳細については、SQLiteの日付と時刻のチュートリアルを確認してください。
SQLitesはtypeof()
を提供します フォーマットに基づいて値のストレージクラスをチェックできるようにする関数。次の例を参照してください:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
SQLiteの1つの列に、混合データ型を格納できます。次の例を参照してください。
まず、test_datatypes
という名前の新しいテーブルを作成します テスト用。
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
次に、test_datatypes
にデータを挿入します テーブル。
INSERT INTO test_datatypes (val)
VALUES
(1),
(2),
(10.1),
(20.5),
('A'),
('B'),
(NULL),
(x'0010'),
(x'0011');
Code language: SQL (Structured Query Language) (sql)
第三に、typeof()
を使用します val
に格納されている各値のデータ型を取得する関数 列。
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
上記のval列のように、SQLiteがさまざまなストレージクラスの列のデータをどのようにソートするかを尋ねる場合があります。
これを解決するために、SQLiteはソートに関して次の一連のルールを提供します:
- NULLストレージクラスの値が最も低くなります。他のどの値よりも低くなっています。 NULL値の間には、順序はありません。
- 次に高いストレージクラスはINTEGERとREALです。 SQLiteはINTEGERとREALを数値で比較します。
- 次に高いストレージクラスはTEXTです。 SQLiteは、TEXT値を比較するときにTEXT値の照合を使用します。
- 最高のストレージクラスはBLOBです。 SQLiteはC関数
memcmp()
を使用します BLOB値を比較します。
ORDER BY
を使用する場合 異なるストレージクラスの列のデータを並べ替える句を使用すると、SQLiteは次の手順を実行します。
- 最初に、ストレージクラスに基づいて値をグループ化します:NULL、INTEGER、およびREAL、TEXT、およびBLOB。
- 次に、各グループの値を並べ替えます。
次のステートメントは、val
内の混合データを並べ替えます test_datatypes
の列 テーブル:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
SQLiteマニフェストの型付けと型の親和性
SQLiteデータ型に関連するその他の重要な概念は、マニフェスト型付けと型親和性です。
- マニフェスト型付けとは、データ型が、値が格納されている列のプロパティではなく、列に格納されている値のプロパティであることを意味します。 SQLiteは、マニフェスト型付けを使用して、任意の型の値を列に格納します。
- 列のタイプアフィニティは、その列に格納されるデータに推奨されるタイプです。データ型は必須ではなく推奨されるため、列には任意の種類のデータを格納できることに注意してください。
このチュートリアルでは、SQLiteデータ型と、ストレージクラス、マニフェスト型付け、型親和性などのいくつかの重要な概念について学習しました。