sqlite3のデータ型

sqlite3のデータ型

今まで、適当に使っていたsqlite3だが、sqlite3のデータ型は5種類あるようだ。

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

数値はintやnumberとして定義してしまっていたが、これは自動でINTEGERと判断されるようだ。
また、charやvarcharと定義した場合は、TEXTとして扱われるようだ。

sqlite3のデータ型の定義は厳密ではなく、可能な限り定義したタイプに変換して登録される。
データ型が異なるからといって、INSERTやUPDATEがエラーになることはない。

INTEGERの項目にはINTEGERとして登録し、
TEXTの項目にはTEXTとして登録される。
INTEGERの項目に’A’を登録しようとするとTEXTの’A’として登録される。
1.5を登録しようとすると、REALの1.5として登録される。
TEXTの項目は、TEXTに変換され登録される。
INTEGERに’1.5 ‘を登録すると、REAL 1.5 として登録され、
TEXTに’1.5 ‘を登録すると、TEXT ‘1.5 ‘として登録される。

かなり上手に型変換してくれるので、余程間違った登録さえしなければ、
数値は数値として、文字は文字として処理できる。

試しに、いろいろな値を入れてみた

データ投入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    a TEXT,
    b INTEGER,
    c REAL,
    d BLOB,
    e
);
INSERT INTO t1 VALUES ('A',  'A',  'A',  'A',  'A'  );
INSERT INTO t1 VALUES ('B ', 'B ', 'B ', 'B ', 'B ' );
INSERT INTO t1 VALUES ('1',  '1',  '1',  '1',  '1'  );
INSERT INTO t1 VALUES ('2 ', '2 ', '2 ', '2 ', '2 ' );
INSERT INTO t1 VALUES (' 3', ' 3', ' 3', ' 3', ' 3' );
INSERT INTO t1 VALUES (' 4 ',' 4 ',' 4 ',' 4 ',' 4 ');
INSERT INTO t1 VALUES (5,    5,    5,    5,    5    );
INSERT INTO t1 VALUES (-6,   -6,   -6,   -6,   -6   );
INSERT INTO t1 VALUES (7.1,  7.1,  7.1,  7.1,  7.1  );
INSERT INTO t1 VALUES (-8.2, -8.2, -8.2, -8.2, -8.2 );
INSERT INTO t1 VALUES (0.009,0.009,0.009,0.009,0.009);
INSERT INTO t1 VALUES (NULL, NULL, NULL, NULL, NULL );

検索

1
2
3
4
5
6
7
8
9
10
11
.header ON
.mode COLUMN
SELECT
    '|' || a || '|' AS TEXT,    typeof(a) AS T_TEXT,
    '|' || b || '|' AS INTEGER, typeof(b) AS T_INTEGER,
    '|' || c || '|' AS REAL,    typeof(c) AS T_REAL,
    '|' || d || '|' AS BLOB,    typeof(d) AS T_BLOB,
    '|' || e || '|' AS NONE,    typeof(e) AS T_NONE
FROM
    t1
;

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TEXT        T_TEXT      INTEGER     T_INTEGER   REAL        T_REAL      BLOB        T_BLOB      NONE        T_NONE
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------
|A|         text        |A|         text        |A|         text        |A|         text        |A|         text
|B |        text        |B |        text        |B |        text        |B |        text        |B |        text
|1|         text        |1|         integer     |1.0|       real        |1|         text        |1|         text
|2 |        text        |2|         integer     |2.0|       real        |2 |        text        |2 |        text
| 3|        text        |3|         integer     |3.0|       real        | 3|        text        | 3|        text
| 4 |       text        |4|         integer     |4.0|       real        | 4 |       text        | 4 |       text
|5|         text        |5|         integer     |5.0|       real        |5|         integer     |5|         integer
|-6|        text        |-6|        integer     |-6.0|      real        |-6|        integer     |-6|        integer
|7.1|       text        |7.1|       real        |7.1|       real        |7.1|       real        |7.1|       real
|-8.2|      text        |-8.2|      real        |-8.2|      real        |-8.2|      real        |-8.2|      real
|0.009|     text        |0.009|     real        |0.009|     real        |0.009|     real        |0.009|     real
            null                    null                    null                    null                    null

まとめ

やはり、なかなかの精度で変換してくれている。
これからも使い続けようと思う。

同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA