SQLite - データタイプ

こんにちは、未来のデータベース魔术師さんたち!今日は、SQLiteのデータタイプの fascinatings な世界に飛び込みます。プログラミングが初めてでも心配しないでください。この旅であなたの親切なガイドとして、すべてをステップバイステップで説明します。コーヒー(またはあなたが好きなお茶)を一杯取り、始めましょう!

SQLite - Data Type

SQLite ストレージクラス

まず最初に、SQLiteのストレージクラスについて話しましょう。これらはSQLiteデータの基本構成要素です。主に5つのストレージクラスがあります:

  1. NULL
  2. INTEGER
  3. REAL
  4. TEXT
  5. BLOB

これらをいくつかの例で詳しく説明します。

NULL

CREATE TABLE example (
id INTEGER,
name TEXT,
age INTEGER
);

INSERT INTO example (id, name) VALUES (1, 'Alice');

この例では、テーブルを作成し、'age'カラムが指定されていない行を挿入しています。SQLiteは自動的にNULL値を割り当てます。NULLはデータが存在しないことを表します。例えば、「アリスの年齢はわかりません」と言うようなものです。

INTEGER

INSERT INTO example (id, name, age) VALUES (2, 'Bob', 30);

ここでは、ボブの年齢を30として挿入しています。SQLiteはこれをINTEGERとして保存します。整数は小数点のない整数です。

REAL

CREATE TABLE products (
id INTEGER,
name TEXT,
price REAL
);

INSERT INTO products (id, name, price) VALUES (1, 'コーヒー', 3.99);

価格3.99はREAL値として保存されます。REALはSQLiteが小数を扱う方法です。

TEXT

INSERT INTO example (id, name, age) VALUES (3, 'Charlie', '25 years old');

ここでは年齢を保存していますが、TEXTを使用しています。SQLiteは「25 years old」という文字列として保存します。

BLOB

BLOBはBinary Large Objectの略で、画像やファイルなどのバイナリデータを保存するために使用されます。

CREATE TABLE files (
id INTEGER,
name TEXT,
content BLOB
);

-- BLOBの挿入は通常、アプリケーションコードで行われ、生のSQLでは行われません

SQLite アフィニティタイプ

次に、アフィニティタイプについて話しましょう。これはSQLiteがデータタイプに柔軟に対応する方法です。SQLiteがデータを保存するにあたり、どのデータタイプを理解しようとしているかを想像してみてください。

SQLiteには5つのアフィニティがあります:

  1. TEXT
  2. NUMERIC
  3. INTEGER
  4. REAL
  5. BLOB

以下の表に示されるように、SQLiteがどのアフィニティを使用するかを決定します:

デクリAREDタイプに含まれる... アフィニティは...
INT INTEGER
CHAR, CLOB, TEXT TEXT
BLOB BLOB
REAL, FLOA, DOUB REAL
その他のもの NUMERIC

実際に見てみましょう:

CREATE TABLE affinity_example (
a TEXT,
b NUMERIC,
c INTEGER,
d REAL,
e BLOB
);

INSERT INTO affinity_example VALUES
('123', '456', '789', '101112', x'ABCDEF');

SELECT typeof(a), typeof(b), typeof(c), typeof(d), typeof(e) FROM affinity_example;

これは以下のように出力されます:

text, integer, integer, real, blob

'456'がNUMERICアフィニティのために整数になったことに注意してください!

SQLite アフィニティとタイプ名

SQLiteはカラムのタイプ名に非常に柔軟です。標準的なSQLタイプを使用し、SQLiteはそれをアフィニティにマッピングします。以下の簡単なリファレンスを参照してください:

タイプ名 アフィニティ
INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 INTEGER
CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB TEXT
BLOB, 未指定のデータ型 BLOB
REAL, DOUBLE, DOUBLE PRECISION, FLOAT REAL
NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME NUMERIC

ブールアニタイプ

SQLiteには別のブールタイプはありませんが、心配しないでください!我々はtrue/falseの値をまだ扱うことができます。SQLiteは0をfalse、1をtrueとして扱います。

CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
description TEXT,
completed BOOLEAN
);

INSERT INTO tasks (description, completed) VALUES
('SQLiteを学ぶ', 0),
('SQLをマスターする', 1);

SELECT * FROM tasks WHERE completed = TRUE;

これは「SQLをマスターする」タスクが戻されます。なぜなら、その'completed'値が1(true)だからです。

日付と時刻データタイプ

最後に、日付と時刻について話しましょう。SQLiteには内蔵の日付や時刻のタイプはありませんが、日付や時刻を扱うためのいくつかの関数を提供しています。

通常、日付と時刻はTEXT、INTEGER、REALとして保存されます:

CREATE TABLE events (
id INTEGER PRIMARY KEY,
name TEXT,
date_text TEXT,
date_int INTEGER,
date_real REAL
);

INSERT INTO events (name, date_text, date_int, date_real) VALUES
('SQLiteワークショップ', '2023-06-15', 1686787200, 1686787200.0);

SELECT name,
date_text,
datetime(date_int, 'unixepoch') as date_from_int,
datetime(date_real, 'unixepoch') as date_from_real
FROM events;

これは以下のように出力されます:

SQLite Workshop, 2023-06-15, 2023-06-15 00:00:00, 2023-06-15 00:00:00

そして、ここまででSQLiteの主なデータタイプ、基本的なストレージクラスからアフィニティまでをカバーしました。SQLiteの柔軟性はその強みであり、同時に注意深く取り扱う必要があります。データが期待通りに保存され、取得されていることを常に確認してください。

練習は完璧を生みますので、これらの概念を試してみてください。自分でテーブルを作成し、データを挿入して、SQLiteがさまざまなシナリオをどのように処理するかを確認してください。間もなく、あなたはSQLiteのデータタイプのエキスパートになるでしょう!

ハッピーコーディング、そしてあなたのデータベースが常に正規化されることを祈っています!

Credits: Image by storyset