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
そんな型はない。たとえばINTEGER
の0
と1
で代用される。
DateTime
そんな型はない。SQLite組込の日付と時刻関数は以下のように保存する。
TEXT
: ISO8601 ("YYYY-MM-DD HH:MM:SS.SSS"
)REAL
: ユリウス日数(紀元前4714年11月24日のグリニッジの正午以降の日数)INTEGER
: Unix時間(Epoch) (1970-01-01 00:00:00からの経過秒数)
アフィニティ
TEXT
NUMERIC
INTEGER
REAL
BLOB
NUMERIC
はそれ以外のどの型名でもないときに使われる。もしデータが無損失で可逆的(15桁以内)ならINTEGER
やREAL
に変換する。もし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
時にやりたいんだが。