SQLiteを学んでいこうという連載の6回目です。前回の記事はこちらになります。
前回は、ドットコマンドの「.mode」を使用した出力表示の設定についてご紹介しました。色々な形式で出力できるので、幅広い用途で使えそうです。
今回はデータの挙動です。SQLiteは動的なデータ型付けを採用しているので状況によって変換されてしまうことがあります。これらの挙動を見ていきましょう。
使用するテーブル
それでは今回の確認に使用するテーブルを作りましょう。Anaconda Promptから「SQLite3」と入力して起動して、インメモリデータベースに接続します。この状態で以下のSQL文を入力、実行します。
CREATE TABLE sample(TYPE TEXT,TEXT TEXT,NUMERIC NUMERIC, INTEGER INTEGER,REAL REAL,BLOB BLOB,XXX);
先頭列はデータのデータ型名を表示します。以降の列は各列データ型に設定され、最終列の「XXX」はデータ型指定なしです。
入力データ
それではこのテーブルの各列に同じデータを入力してみましょう。BLOB型ですが、「x」の後に「'」で括った16進数で表現できます。
INSERT INTO sample(TYPE,TEXT,NUMERIC,INTEGER,REAL,BLOB,XXX) VALUES ("INTEGER",1,1,1,1,1,1), ("REAL",1.5,1.5,1.5,1.5,1.5,1.5), ("TEXT_1","1","1","1","1","1","1"), ("TEXT_A","A","A","A","A","A","A"), ("NULL",NULL,NULL,NULL,NULL,NULL,NULL), ("BLOB",x'31',x'31',x'31',x'31',x'31',x'31');
結果を見てみると、以下の様になりました。
sqlite> .mode qbox sqlite> SELECT * FROM sample; ┌───────────┬───────┬─────────┬─────────┬───────┬───────┬───────┐ │ TYPE │ TEXT │ NUMERIC │ INTEGER │ REAL │ BLOB │ XXX │ ├───────────┼───────┼─────────┼─────────┼───────┼───────┼───────┤ │ 'INTEGER' │ '1' │ 1 │ 1 │ 1.0 │ 1 │ 1 │ │ 'REAL' │ '1.5' │ 1.5 │ 1.5 │ 1.5 │ 1.5 │ 1.5 │ │ 'TEXT_1' │ '1' │ 1 │ 1 │ 1.0 │ '1' │ '1' │ │ 'TEXT_A' │ 'A' │ 'A' │ 'A' │ 'A' │ 'A' │ 'A' │ │ 'NULL' │ NULL │ NULL │ NULL │ NULL │ NULL │ NULL │ │ 'BLOB' │ x'31' │ x'31' │ x'31' │ x'31' │ x'31' │ x'31' │ └───────────┴───────┴─────────┴─────────┴───────┴───────┴───────┘
各列の挙動
それでは各列の挙動を見ていきましょう。
TEXT列
TEXTデータは勿論そのままなのですが、数値もTEXTデータに変換してしまいます。NULLとBLOBの入力データはそのまま登録されるんですね。
NUMERIC列とINTEGER列
NUMERIC列とINTEGER列はまったく同じ挙動になりました。数値変換できるものはTEXTデータでも数値に変換されます。あと、INTEGER列でもREALデータを小数点以下の値を含めて登録できています。この辺は不思議ですね。
REAL列
REAL列もNUMERIC列、INTEGER列と同じような挙動ですね。ただし、コチラはINTEGERとして認識されるデータについても小数点以下の数値が付加されます。
BLOB列とデータ型指定なしの列
BLOB列とデータ型指定なしの列は、同じ挙動になりました。数値データは数値データとして、TEXTデータはTEXTデータとしてそのまま登録されています。
挙動の特徴
以上が各列の挙動になります。まず驚いたのは、どんなデータ型のデータを登録してもエラーが出ないということです。普通のデータベースシステムやプログラミング言語とは違う趣です。十分注意が必要ですね。また、数値変換できないTEXTデータ、NULL、BLOBデータは列の設定にかかわらず、そのまま登録されます。 同じ挙動をする列もあったのですが、これらについては別途追求していこうと思います。
次回は日時の扱い方
いかがでしょうか。SQLiteのデータの扱いは少し変わっていますね。さて、ここまでSQLiteのデータ型について見てきましたが、日時を扱うデータ型がありませんね。日付や時間はどのように扱うのでしょうか?次回はここを追及していこうと思います。お楽しみに!!