SQLiteのデータ型

SQLiteはカラムごとに型を指定する必要はなく、値ごとにデータ型が決定されます。これを Strage Class (内部クラス)と言います。

データ型特徴
NULLNULL値
INTEGER符号付き整数。1,2,3,4,6,8バイトのいずれかで格納される。
REAL浮動小数点型。8バイトで格納される。
TEXTUTF-8,UTF-16BE,UTF-16LE のいずれかで格納される。
BLOBBinary Large Object。入力データがそのまま格納される。

INTEGERはディスクに格納される際にはそのサイズに応じたバイト数を確保されますが、メモリ展開時には8バイトの数値型になります。

カラムで指定するのは「おすすめの型」

SQLiteでテーブル作成時に指定するデータ型はあくまでも「おすすめの型」になります。(この型をAffinityと言います)

例えば「TEXT Affinity」には「NULL」「TEXT」「BLOB」のいずれかの型で値が格納されます。それ以外のデータ型で格納されそうな時には変換がされるわけですね。

Affinity格納できるストレージクラス
TEXTNULL,TEXT,BLOB
NUMERIC全て
INTEGER全て
REAL全て
BLOB入力された値は変換されることなく格納される

試してみましょう。

INTEGER Affinity に文字列を挿入してみる

次のテーブルを用意します。

CREATE TABLE product(id INTEGER,name TEXT);

idカラムには INTEGER Affinity を、nameカラムには TEXT Affinity を指定していますね。

INTEGER Affinity の列に文字列を挿入してみましょう。文字列を挿入する際はシングルクォーテーションで囲みます。

INSERT INTO product VALUES ('tarou','yamada');

一見、エラーになりそうですが入っちゃいます。

SELECT * FROM product;

-- 出力結果
-- tarou|yamada

ちなみに、挿入した値のデータ型を調べてみると TEXT になっています。確かに値ごとにデータ型を持っていますね。

SELECT typeof(id) FROM product
WHERE name = 'yamada';

-- 出力結果
-- text

TEXT Affinity に数値型を挿入してみる

TEXT Affinity に数値型を挿入してみる

TEXT Affinity には INTEGER型で値は格納できないので、変換がされるはずです。

やってみましょう。先ほどのテーブルを使います。

CREATE TABLE product(id INTEGER,name TEXT);

nameカラムに、数値データを挿入してみましょう。

INSERT INTO product VALUES (1,100);

データ型を見てみます。

SELECT typeof(name) FROM product
WHERE id = 1;
-- 出力結果
-- text

TEXT 型になっていますね。

各Affinityの変換については公式サイトが参考になります。

https://sqlite.org/datatype3.html?utm_source=chatgpt.com

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール