当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SQLite不正确的CREATETABLE语句不会引发任何错误或警告》经验,为你挑选了1个好方法。

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

CREATE TABLE mystery_table(id mystery_type)

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

SELECT name FROM sqlite_master where type = 'table'

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



1> jb326..:

对于它的价值,这也可以在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.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有