当我在Python中运行不正确的语句时,我没有收到任何错误或警告.声明如下:
CREATE TABLE mystery_table(id mystery_type)
如你所见,我在这里使用了一个不正确的数据类型mystery_type
,仍然创建了表,当我运行时
SELECT name FROM sqlite_master where type = 'table'
我得到了一份表格列表mystery_table
.那么,为什么呢?为什么有可能运行一些垃圾声明并获得一些结果?谢谢!PS.我不是在sqlite3提示符下运行所有这些命令,而是通过Python运行.
对于它的价值,这也可以在sqlite3控制台中实现.
基于sqlite3常见问题解答,sqlite似乎没有严格执行您在创建表时应用的类型约束,而是在以后检索时使用它们来格式化数据:
[SQLite]不强制实施数据类型约束.任何类型的数据都可以(通常)插入任何列.[...]但SQLite确实使用声明的列类型作为提示,您更喜欢该格式的值.因此,例如,如果列的类型为INTEGER,并且您尝试将字符串插入该列,则SQLite将尝试将该字符串转换为整数.如果可以的话,它会插入整数.如果没有,则插入字符串.此功能称为类型亲缘关系.
类型亲缘关系的文档表明,如果它不能识别您提供的类型,它会应用NUMERIC的数据类型:
列的亲缘关系由声明的列类型决定,根据以下显示的顺序规则:
如果声明的类型包含字符串"INT",则为其分配INTEGER affinity.
如果列的声明类型包含任何字符串"CHAR","CLOB"或"TEXT",则该列具有TEXT亲和性.请注意,VARCHAR类型包含字符串"CHAR",因此分配了TEXT亲和性.
如果列的声明类型包含字符串"BLOB",或者未指定类型,则该列具有关联BLOB.
如果列的声明类型包含任何字符串"REAL","FLOA"或"DOUB",则该列具有REAL亲和性.
否则,亲和力是NUMERIC.
基于此,看起来sqlite将您的mystery_type
数据类型解释为NUMERIC.