【プログラミング】SQLite3:データの型

  • URLをコピーしました!
目次

SQLite3

前回、データベース管理システムSQLite3でデータベースの作成、テーブルの追加、データの追加、データの取得を試してみました。

今回はSQLite3で使用できるデータの型に関して色々と試していきましょう。

ちなみにPythonの型に関してはこちらの記事で解説していますので、よかったらどうぞ。

それでは始めていきましょう。

SQLite3のデータの型

最初にSQLite3で使用できるデータの型は以下の5つです。

データ型意味Pythonの場合の型
TEXT文字列str
INTEGER整数int
REAL小数float
NULLNULL値
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」になってしまっていますが、よく分からない型なのでこのまま進めます。

この結果からすると、下の表のようにそれぞれ自動で変換され、格納されるのが分かります。

指定した型入力した型
TEXTINTEGERREALNULL
TEXTTEXTTEXTTEXTNULL
INTEGERTEXTINTEGERREALNULL
REALTEXTREALREALNULL
NULLTEXTINTEGERREALNULL

型を指定しないでテーブルを作成

色々と調べていくと、どうやらテーブルを作成する際、型を指定するのは必須ではないようでした。

ということで型を指定せずにテーブルを作成し、入力した値がどう認識されるのか試してみましょう。

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」なのかをはっきりさせるためにも型は指定しておくべきかなと思います。

次回は特定の条件に合うデータを抽出する方法を試していきましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次