使用无效数据类型时,为什么SQLite3不会失败

时间:2015-08-12 07:29:44

标签: sqlite

我在sitepoint.com上的教程中创建了一个表

CREATE TABLE comments ( 
post_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
name TEXT NOT NULL, 
email TEXT NOT NULL, 
website TEXT NULL, 
comment TEXT NOT NULL );

然后我尝试添加一列

ALTER TABLE comments
INSERT COLUMN enabled BOOL

然后我意识到SQLite中没有BOOL类型。但是条目被添加

sqlite> .schema comments
CREATE TABLE comments (
post_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
website TEXT NOT NULL,
comment TEXT NOT NULL , enabled BOOL);

为什么SQLite不反对?

2 个答案:

答案 0 :(得分:4)

根据http://www.sqlite.org/datatype3.html#affname

  

列的亲和力由声明的列类型决定,按照以下规则显示:

     
      
  1. 如果声明的类型包含字符串“INT”,则会为其指定INTEGER亲和力。

  2.   
  3. 如果声明的列类型包含任何字符串“CHAR”,“CLOB”或“TEXT”,则该列具有TEXT亲和性。请注意,VARCHAR类型包含字符串“CHAR”,因此分配了TEXT affinity。

  4.   
  5. 如果列的声明类型包含字符串“BLOB”,或者未指定类型,则该列具有关联BLOB。

  6.   
  7. 如果列的声明类型包含任何字符串“REAL”,“FLOA”或“DOUB”,则该列具有REAL亲和力。

  8.   
  9. 否则,亲和力为NUMERIC。

  10.   

基本上,您可以对列使用任何声明的类型,其亲和力将由上述规则确定。具有BOOL声明类型的列将具有NUMERIC亲和力。

答案 1 :(得分:1)

由于Type affinity

要使它变短sqlite会尝试找到最相关的类型,即使它与官方的类型不匹配。这是出于与其他数据库的兼容性原因而完成的。