SQLiteはカラムごとに型を指定する必要はなく、値ごとにデータ型が決定されます。これを Strage Class (内部クラス)と言います。
| データ型 | 特徴 |
| NULL | NULL値 |
| INTEGER | 符号付き整数。1,2,3,4,6,8バイトのいずれかで格納される。 |
| REAL | 浮動小数点型。8バイトで格納される。 |
| TEXT | UTF-8,UTF-16BE,UTF-16LE のいずれかで格納される。 |
| BLOB | Binary Large Object。入力データがそのまま格納される。 |
INTEGERはディスクに格納される際にはそのサイズに応じたバイト数を確保されますが、メモリ展開時には8バイトの数値型になります。
カラムで指定するのは「おすすめの型」
SQLiteでテーブル作成時に指定するデータ型はあくまでも「おすすめの型」になります。(この型をAffinityと言います)
例えば「TEXT Affinity」には「NULL」「TEXT」「BLOB」のいずれかの型で値が格納されます。それ以外のデータ型で格納されそうな時には変換がされるわけですね。
| Affinity | 格納できるストレージクラス |
| TEXT | NULL,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の変換については公式サイトが参考になります。