SQLite不正确的CREATE TABLE语句不会引发任何错误或警告

时间:2016-01-03 18:47:51

标签: python sqlite

当我在Python中运行不正确的语句时,我没有收到任何错误或警告。声明如下:

CREATE TABLE mystery_table(id mystery_type)

如您所见,我在这里使用了不正确的数据类型mystery_type,仍然创建了表格,当我运行时

SELECT name FROM sqlite_master where type = 'table'

我得到一个包含mystery_table的表格列表。那么,为什么呢?为什么有可能运行一些垃圾声明并获得一些结果?谢谢! PS。我不是在sqlite3提示符下运行所有​​这些命令,而是通过Python运行。

1 个答案:

答案 0 :(得分:5)

对于它的价值,这也可以在sqlite3控制台中实现。

基于sqlite3 FAQs,sqlite似乎没有严格执行您在创建表时应用的类型约束,而是在以后检索时使用它们来格式化数据:

  

[SQLite]不强制执行数据类型约束。任何类型的数据都可以(通常)插入任何列。 [...]但SQLite确实使用声明的列类型作为提示,您更喜欢该格式的值。因此,例如,如果列的类型为INTEGER,并且您尝试将字符串插入该列,则SQLite将尝试将该字符串转换为整数。如果可以的话,它会插入整数。如果没有,则插入字符串。此功能称为类型亲和力。

documentation on type affinity表示如果它无法识别您提供的类型,则会应用NUMERIC的数据类型:

  

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

     
      
  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.   

基于此,看起来sqlite将您的mystery_type数据类型解释为NUMERIC。