数据类型很奇怪,但在sqlite3中已被接受

时间:2016-01-11 18:50:59

标签: sqlite

我创建了一个这样的表

创建表tablename(名称blahblahblah);

名称的数据类型很奇怪,但是sqlite3已经接受了。为什么不抛出类似“无效数据类型”的错误消息?

1 个答案:

答案 0 :(得分:1)

SQLite对数据类型的处理方式与大多数其他数据库系统不同。它们不与列相关联,而是与每个单独的值相关联。当您指定"数据类型"当你创建一个表时,你正在做的是定义SQLite所谓的"类型亲和力":

  

为了最大化SQLite与其他数据库引擎之间的兼容性,SQLite支持"类型亲和力"在列上。列的类型亲缘关系是存储在该列中的数据的推荐类型。这里的重要思想是建议使用类型,而不是必需的。任何列仍然可以存储任何类型的数据。根据选择,某些列更倾向于使用一个存储类而不是另一个存储类。列的首选存储类称为" affinity"。

datatypes documentation描述了如何确定亲和力:

  

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

     
      
  1. 如果声明的类型包含字符串" INT"然后它被赋予INTEGER亲和力。
  2.   
  3. 如果声明的列类型包含任何字符串" CHAR"," CLOB"或" TEXT"然后该列具有TEXT亲和力。请注意,VARCHAR类型包含字符串" CHAR"因此被分配了TEXT亲和力。
  4.   
  5. 如果列的声明类型包含字符串" BLOB"或者,如果未指定类型,则该列具有关联BLOB。
  6.   
  7. 如果列的声明类型包含任何字符串" REAL"," FLOA"或" DOUB"然后该列具有REAL亲和力。
  8.   
  9. 否则,亲和力为NUMERIC。
  10.         

    请注意,确定列关联性的规则的顺序很重要。声明类型为" CHARINT"将匹配规则1和2,但第一个规则优先,因此列关联性将为INTEGER。

请注意,规则5是一个全能的。因此,没有"无效"数据类型。在您的示例中,由于它不适合任何其他规则,因此列类型为" blahblahblah"会有NUMERIC亲和力。