1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLiteでカラムの型をタイポしても自動判断された件

Posted at

SQLiteでテーブル定義をするときにアレっと思ったのでメモ。

公式より

3.1. Determination Of Column Affinity
The affinity of a column is determined by the declared type of the column, according to the following rules in the order shown:

  1. If the declared type contains the string "INT" then it is assigned INTEGER affinity.
  2. If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" then that column has TEXT affinity. Notice that the type VARCHAR contains the string "CHAR" and is thus assigned TEXT affinity.
  3. If the declared type for a column contains the string "BLOB" or if no type is specified then the column has affinity BLOB.
  4. If the declared type for a column contains any of the strings "REAL", "FLOA", or "DOUB" then the column has REAL affinity.
  5. Otherwise, the affinity is NUMERIC.
    Note that the order of the rules for determining column affinity is important. A column whose declared type is "CHARINT" will match both rules 1 and 2 but the first rule takes precedence and so the column affinity will be INTEGER.

らしいです。今回、自分が不思議に思ったのは上記の1.について。

起きたこと

以下のCREATE文を実行しました。

CREATE TABLE IF NOT EXISTS foo (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  bar_id INTEGET NOT NULL,
  ...
);

「bar_id」の型をよく見ると「 INTEGET 」になっています。タイポですね、はい。お恥ずかしい。

ところが、このSQLを実行してもなんのエラーも起きず正常に完了し、テーブルは作成されていました。クライアントで確認してみても、以下の通り。

image.png

データ型のところが思いっきり「INTEGET」になっていますね…。このテーブルを使うアプリケーションからも全く問題なくORマッピングでき、データ操作ができていました。

  1. If the declared type contains the string "INT" then it is assigned INTEGER affinity.

ということで、「INTEGET」の中にはちゃんと「INT」という文字列が入っていたので、INTEGER扱いでカラムが作成されているようです。実際、整数値が登録できました。

その後、あるタイミングでSQLを見直したときにタイポに気付いた、というわけです。

まとめ

  • タイポしても自動的に近いものに解釈される
  • 解釈できなかったものは全てNUMERICになる

優しい仕様な気がしますが、知らないとちょっと怖いですね、これ…。あと、これSQLite固有なのかな? PostgreSQLとかMySQLとか、どうなんだろう。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?