SQLite3的动态类型

时间:2010-03-22 03:53:06

标签: database sqlite dynamic-typing

与其他SQL版本相比,SQLite3使用动态类型而不是静态类型。 SQLite website读取:

  

大多数SQL数据库引擎(除了SQLite之外的每个SQL数据库引擎,据我们所知)都使用静态,严格的类型。使用静态类型,值的数据类型由其容器(存储值的特定列)确定。

     

SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身相关联,而不是与其容器相关联。

在我看来,这正是你想要的,因为它允许你存储整数列中的字符串。

页面继续:

  

... SQLite中的动态类型允许它执行传统的刚性类型数据库中无法实现的操作。

我有两个问题:

  1. 用例问题:SQLite3的动态类型有哪些例子?
  2. 历史/设计问题:动态类型实现SQLite的动机是什么?

2 个答案:

答案 0 :(得分:9)

这在SQLite中称为type affinity

据SQLite网站称,他们这样做是为了“最大化SQLite与其他数据库引擎之间的兼容性”。 (见上面的链接)

  

SQLite支持列上“类型亲和力”的概念。列的类型亲缘关系是存储在该列中的数据的推荐类型。这里的重要思想是建议使用类型,而不是必需的。任何列仍然可以存储任何类型的数据。根据选择,某些列更倾向于使用一个存储类而不是另一个存储类。列的首选存储类称为“affinity”。

我的理解是SQLite正是它的名字 - 一个非常轻量级的简约数据库引擎。与强类型相关的开销可能超出了项目的范围,最好留给使用SQLite的应用程序。

但是,根据他们的网站,他们已经做到这一点,以最大限度地提高与其他数据库引擎的兼容性。

答案 1 :(得分:4)

如果你看一下Firefox的“about:config”页面,我相信这些设置实际上存储在SQlite数据库中(尽管我不是100%肯定)。使用SQlite动态类型的好处是设置中的每个值都可以是强类型的(例如,“alerts.totalOpenTime”设置是一个整数,而“app.update.channel”是一个字符串),而不必有一个单独的每种类型的列。

这与编程语言基本相同,最后:为什么在静态类型中使用编程语言动态输入?