SQLite | データ型 | 保存された値のデータ型を確認する
カラムに型を指定した場合と指定しない場合で、値がどの型として保存されるかを比較します。保存値は最終的にNULL、INTEGER、REAL、TEXT、BLOBの5つに分類されます。
カラムにデータ型を指定しない場合
型を指定しない2つのカラムを持つテーブルを作成します。この場合はNONEアフィニティとなり、値は自動変換されずに保存されます。
create table test (val1, val2);
$ sqlite3 test.sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite>
sqlite> create table test (val1, val2);
sqlite>
3行を追加します。
insert into test values(null, 51);
insert into test values(3.14, 'devkuma');
insert into test values('Good Morning', 1.3e-2);
sqlite> insert into test values(null, 51);
sqlite> insert into test values(3.14, 'devkuma');
sqlite> insert into test values('Good Morning', 1.3e-2);
sqlite>
保存したデータを検索します。
select * from test;
見やすいように.modeと.headersを変更します。
sqlite> select * from test;
|51
3.14|devkuma
Good Morning|0.013
sqlite>
sqlite> .mode column
sqlite> .header on
sqlite>
sqlite> select * from test;
val1 val2
---------- ----------
51
3.14 devkuma
Good Morni 0.013
sqlite>
typeof()を使い、各値と保存クラスを表示します。
select val1, typeof(val1), val2, typeof(val2) from test;
sqlite> select val1, typeof(val1), val2, typeof(val2) from test;
val1 typeof(val1) val2 typeof(val2)
---------- ------------ ---------- ------------
null 51 integer
3.14 real devkuma text
Good Morni text 0.013 real
sqlite>
NULLはNULL、整数はINTEGER、文字列はTEXT、浮動小数点数はREALとして保存されます。保存型は追加した値に従います。
カラムにデータ型を指定する場合
次に、カラムの宣言型が保存値にどう影響するかを確認します。
第1カラムをTEXT、第2カラムをNUMERICにしたテーブルを作成します。
create table test2 (val1 text, val2 numeric);
sqlite> create table test2 (val1 text, val2 numeric);
sqlite>
3行を追加します。
insert into test2 values ('Summer', 'Summer');
insert into test2 values (48, 48);
insert into test2 values ('72', '72');
insert into test2 values (39.24, 39.24);
insert into test2 values ('0.17', '0.17');
insert into test2 values (null, null);
sqlite> insert into test2 values('Summer', 'Summer');
sqlite> insert into test2 values(48, 48);
sqlite> insert into test2 values('72', '72');
sqlite> insert into test2 values(39.24, 39.24);
sqlite> insert into test2 values('0.17', '0.17');
sqlite> insert into test2 values(null, null);
sqlite>
値と保存クラスを検索します。
select val1, typeof(val1), val2, typeof(val2) from test2;
sqlite> select val1, typeof(val1), val2, typeof(val2) from test2;
val1 typeof(val1) val2 typeof(val2)
---------- ------------ ---------- ------------
Summer text Summer text
48 text 48 integer
72 text 72 integer
39.24 text 39.24 real
0.17 text 0.17 real
null null
sqlite>
TEXTカラムでは文字列はそのまま保存され、整数と実数はTEXTへ変換されます。NULLは変換されません。
NUMERICカラムでは文字列をINTEGERまたはREALへ変換し、失敗した場合はTEXTのまま保存します。NULLは変換されません。
この例から、宣言型によって値が変換されて保存される場合があることが分かります。