SQLite3
前回、データベース管理システムSQLite3でデータベースの作成、テーブルの追加、データの追加、データの取得を試してみました。
今回はSQLite3で使用できるデータの型に関して色々と試していきましょう。
ちなみにPythonの型に関してはこちらの記事で解説していますので、よかったらどうぞ。
それでは始めていきましょう。
SQLite3のデータの型
最初にSQLite3で使用できるデータの型は以下の5つです。
データ型 | 意味 | Pythonの場合の型 |
TEXT | 文字列 | str |
INTEGER | 整数 | int |
REAL | 小数 | float |
NULL | NULL値 | |
BLOB | 入力されたバイナリーデータそのまま |
できるだけPythonのデータ型と比較してみましたが、「NULL」と「BLOB」は分かりませんでした。
何はともあれこの5つの型を使ってデータを保存します。
テーブル作成のおさらい
それではテーブル作成のおさらいをしつつ、5つのデータ型を格納してみましょう。
まずはターミナルでSQLite3を起動させます。
sqlite3 test2.db
そしてデータベースを作成します。
sqlite> .databases
次にテーブルを作成しますが、ここで全ての型を指定してみましょう。
sqlite> CREATE TABLE table1(text TEXT, integer INTEGER, real REAL, nullval NULL, blob BLOB);
ちなみに「null」という名前の列は作成できなかったので「nullval」にしています。
ここにそれぞれの型に合うデータを追加していってみましょう。
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values('text', 10, 3.14, null, 'blob');
追加したデータを表示してみます。
sqlite> SELECT * FROM table1;
実行結果
text|10|3.14||blob
入力した通りのデータが表示されました。
入力されたデータの型の確認
先ほど、入力された通りのデータが表示されましたが、このままではデータがどのような型で格納されているか分かりません。
例えば「10」はもしかしたら文字列の「10」かもしれません。
ということで型を確認してみましょう。
その場合には「SELECT TYPEOF(列名) FROM テーブル名」とします。
複数の列を確認するには「,(カンマ)」で区切ります。
sqlite> SELECT TYPEOF(text), TYPEOF(integer), TYPEOF(real), TYPEOF(nullval), TYPEOF(blob) FROM table1;
実行結果
text|integer|real|null|text
入力した通りの型で格納されていることが分かりました。
指定した型と違う型で入力した場合
それではもしテーブル作成時に指定した型と違う型で入力した場合どうなってしまうのか試してみましょう。
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values('text', 'text', 'text', 'text', 'text');
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values(10, 10, 10, 10, 10);
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values(3.14, 3.14, 3.14, 3.14, 3.14);
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values(null, null, null, null, null);
sqlite> INSERT INTO table1(text, integer, real, nullval, blob) values('blob', 'blob', 'blob', 'blob', 'blob');
入力された値を確認してみます。
sqlite> SELECT * FROM table1;
実行結果
text|10|3.14||blob
text|text|text|text|text
10|10|10.0|10|10
3.14|3.14|3.14|3.14|3.14
||||
blob|blob|blob|blob|blob
次にそれぞれの型を確認してみましょう。
sqlite> SELECT TYPEOF(text), TYPEOF(integer), TYPEOF(real), TYPEOF(nullval), TYPEOF(blob) FROM table1;
実行結果
text|integer|real|null|text
text|text|text|text|text
text|integer|real|integer|integer
text|real|real|real|real
null|null|null|null|null
text|text|text|text|text
正直「blob」はこの例では「text」になってしまっていますが、よく分からない型なのでこのまま進めます。
この結果からすると、下の表のようにそれぞれ自動で変換され、格納されるのが分かります。
指定した型 | 入力した型 | |||
TEXT | INTEGER | REAL | NULL | |
TEXT | TEXT | TEXT | TEXT | NULL |
INTEGER | TEXT | INTEGER | REAL | NULL |
REAL | TEXT | REAL | REAL | NULL |
NULL | TEXT | INTEGER | REAL | NULL |
型を指定しないでテーブルを作成
色々と調べていくと、どうやらテーブルを作成する際、型を指定するのは必須ではないようでした。
ということで型を指定せずにテーブルを作成し、入力した値がどう認識されるのか試してみましょう。
sqlite> CREATE TABLE table2(text, integer, real, nullval, blob);
sqlite> INSERT INTO table2 values('text', 10, 3.14, null, 'blob');
sqlite> SELECT TYPEOF(text), TYPEOF(integer), TYPEOF(real), TYPEOF(nullval), TYPEOF(blob) FROM table2;
実行結果
text|integer|real|null|text
入力された値から自動で型が認識され、データが格納されました。
このようにSQLite3では型が自動で設定されるのですが、やはり型が分からない、例えば「10」と「’10’」のように「整数の10」なのか「文字列の10」なのかをはっきりさせるためにも型は指定しておくべきかなと思います。
次回は特定の条件に合うデータを抽出する方法を試していきましょう。
ではでは今回はこんな感じで。
コメント