SQLiteでのデータ型

本日は、SQLiteネタである。
SQLiteには、データ型があってないようなものとなっている。
普通のデータベースシステムには、データ型が存在する。
OracleやSQL Serverには、CHARやVARCHAR、NUMBERやINTEGER、DATEやらDATETIMEなんていう型が存在している。MS Accessにだってある。
CHARとVARCHARは「文字列型」
NUMBER、INTEGERは「整数型」
DATE、DATETIMEは「日付時刻型」
データ型は「列(フィールド)」に対して設定できる。数値型に設定された列には、数値が記録できる。文字列は記録できない。文字列を記録しようと思ったら、文字列型に設定しなければならない。
データ型には許容できる数値の大きさが付き物となっている。
データベースが大容量のストレージを持っていたとしても、無制限にデータを記録できるものではないし、記憶領域の大きさを決めた方が、効率的である。
例えば、以下のようなテーブルをOracleに作成したとする。

CREATE TABLE foo (
text VARCHAR2(10),
num NUMBER(8)
);

fooテーブルの、text列には、最大で10バイトの文字列データを記録できる。
num列は、NUMBER型なので、数値を記録可能ではあるが、(8)となっているので、最大8桁の整数値を記録可能となっている。
text列に、数字から構成される文字列を記録することはできる。例えば、以下のようなINSERT命令はOKである。

INSERT INTO foo(text) VALUES('123');

num列に対して、文字列を記録するような命令は、エラーとなり実行できない。

INSERT INTO foo(num) VALUES('text');

これと同じことをSQLiteでやってみると

CREATE TABLE foo (
text TEXT,
num NUMERIC
);
INSERT INTO foo(text) VALUES('123');
INSERT INTO foo(num) VALUES('text');

どちらのINSERT命令も成功する。

SELECT * FROM foo
text    num
-----------------------
123
text

こんな感じでちゃんと記録できる。
便利なんだか、ルーズなんだか。
ちなみに、CREATE TABLEでの列定義でデータ型を省略できる。

CREATE TABLE foo (
text,
num
);

投稿者プロフィール

asai
asai