SQLite | データ型 | 保存された値のデータ型を確認する

カラムに型を指定した場合と指定しない場合で、値がどの型として保存されるかを比較します。保存値は最終的にNULLINTEGERREALTEXTBLOBの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> 

NULLNULL、整数は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は変換されません。

この例から、宣言型によって値が変換されて保存される場合があることが分かります。