SQLite 不检查数据类型

Posted

技术标签:

【中文标题】SQLite 不检查数据类型【英文标题】:SQLite does not check Data Types 【发布时间】:2017-11-01 09:35:14 【问题描述】:

尊敬的 Stack Overflow 社区,

我第一次尝试数据库设计时遇到了一点问题。

我尝试制作某种表格并尝试检查基本功能;使用 Python3 和 SQLite3 编写。

我的问题很简单,我有几行:

cur.execute('CREATE TABLE IF NOT EXISTS test(a INTEGER, argument DATE)')

现在我可以写了:

cur.execute('insert into test (a, argument) values (?,?)', "bla", "blabla")

没有收到错误消息;当您在CREATE TABLE 语句中定义允许的数据类型时,该命令不应该被 SQL 自动禁止吗?

完整代码在这里:http://codepad.org/kf4gZB7m

【问题讨论】:

欢迎来到 SO,用问题中的代码更新您的问题 【参考方案1】:

这是一项功能,而不是错误。 SQLite 使用动态类型。见https://sqlite.org/faq.html#q3

【讨论】:

好的,谢谢您的回答!此功能是否与某些性能损失或更高的内存消耗有关?如果是,有没有办法禁用此功能? 不知道内存消耗,但肯定没有办法让 SQLite 更严格的类型。你需要一个不同的 SQL 实现。 SQLite 通常使用更少的内存并且比其他数据库更快,但是比较嵌入式和客户端/服务器数据库并没有真正意义。如果你真的需要,可以add manual checks。 这是一个非常糟糕的功能。至少应该有一种方法可以打开正确的类型检查。 :-/【参考方案2】:

此功能是类型相似性

使用严格类型的 SQL 数据库引擎通常会尝试 自动将值转换为适当的数据类型。这 这里的重要思想是该类型是推荐的,而不是必需的。

文档:https://sqlite.org/datatype3.html#affinity

【讨论】:

以上是关于SQLite 不检查数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在 INSERT 上使用正确的数据类型 Flutter SQLite 数据类型不匹配

SQLite数据类型

如果在 SQLite 中不指定新列的数据类型怎么办?

sqlite数据库中能不能存放布尔类型的数据

SQLite 数据类型

SQLite 3.37.0 发布,支持严格的字段数据类型