やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習 データ型とアフィニティ

 VARCHARやTEXTが文字列型になるのはアフィニティのせい。

対象環境

情報源

データ型

意味 型名
NULL NULL。特殊値。
INTEGER 符号付き整数。値に応じて1,2,4,6,8Byte INTを含む
REAL IEEE浮動小数点数。8Byte REAL,FLOA,DOUBのいずれかを含む
TEXT 文字列。UTF-8, UTF-16BE, UTF-16LEのいずれか CHAR,CLOB,TEXTのいずれかを含む
BLOB バイナリ。任意サイズ BLOB

 create文で文字列をつくるとき、TEXTだったりVARCHARだったりする。VRCHARにはCHARという文字列が含まれているためTEXT型と判断される。

Boolean

 そんな型はない。たとえばINTEGER01で代用される。

DateTime

 そんな型はない。SQLite組込の日付と時刻関数は以下のように保存する。

アフィニティ

  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • BLOB

 NUMERICはそれ以外のどの型名でもないときに使われる。もしデータが無損失で可逆的(15桁以内)ならINTEGERREALに変換する。もし3.0e+5という文字列なら300000とする。300000.0ではない。

変換の例

 それぞれの型をした列がある。

CREATE TABLE t1(
    t  TEXT,     -- text affinity by rule 2
    nu NUMERIC,  -- numeric affinity by rule 5
    i  INTEGER,  -- integer affinity by rule 1
    r  REAL,     -- real affinity by rule 4
    no BLOB      -- no affinity by rule 3
);

 シングルクォート''で文字列として小数点付きの数字を挿入する。

-- TEXT
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text

 小数値を挿入する。

-- REAL
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|real

 整数値を挿入する。

-- INTEGER
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer

 16進数のバイナリ値を挿入する。

-- BLOB
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob

 NULLを挿入すうる。

-- NULL
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|null

演算子

 演算子の一覧を公式から探してみたが見つけられず。

 非公式ならあった。次回くわしく勉強しよう。

照合シーケンス

 大小比較する方法。

照合シーケンス 意味
BINARY テキストのエンコーディングを無視してバイナリ比較する
NOCASE アルファベットの大文字と小文字を無視して比較する
RTRIM 末尾のスペースを無視してBINARY比較する
CREATE TABLE t1(
    x INTEGER PRIMARY KEY,
    a,                 /* collating sequence BINARY */
    b COLLATE BINARY,  /* collating sequence BINARY */
    c COLLATE RTRIM,   /* collating sequence RTRIM  */
    d COLLATE NOCASE   /* collating sequence NOCASE */
);

 へぇ、こーゆーのあるんだ。知らなかった。

 でもテーブル定義時でなくselect時にやりたいんだが。

前回まで