SQLite是无类型的吗?

时间:2012-03-21 07:43:49

标签: java android sqlite

如果sqlite是无类型的,为什么我们声明列的数据类型? declare数据类型有什么用?

Why android SQLite can store double value(java 8 bytes) into float column

3 个答案:

答案 0 :(得分:3)

声明的列数据类型用作提示(http://sqlite.org/faq.html#q3):

  

因此,例如,如果列的类型为INTEGER,并且您尝试将字符串插入该列,则SQLite将尝试将该字符串转换为整数。如果可以的话,它会插入整数。如果没有,则插入字符串。此功能称为类型亲缘关系。

顺便说一句,SQLite不是无类型的;它使用动态类型。这意味着您插入的任何值都保留其自己的类型信息,而不是从表声明中推断出类型。 http://sqlite.org/datatype3.html

答案 1 :(得分:2)

它用于确定列的“亲和力”。

CREATE TABLE Example (
    IntegerAffinity    INTEGER,
    RealAffinitity     REAL,
    NumericAffinity    NUMERIC,
    TextAffinity       TEXT,
    NoAffinity
);

在此表中插入一些值(使用Python的sqlite3模块)给出:

>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [1234] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['1234'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [math.pi] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [str(math.pi)] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['ABC'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'5678'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'\xAB\xCD\xEF'] * 5)
>>> list(db.execute("SELECT * FROM Example"))
[(1234, 1234.0, 1234, '1234', 1234),
 (1234, 1234.0, 1234, '1234', '1234'),
 (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.14159265358979', 3.141592653589793),
 (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.141592653589793', '3.141592653589793'),
 ('ABC', 'ABC', 'ABC', 'ABC', 'ABC'),
 (b'5678', b'5678', b'5678', b'5678', b'5678'),
 (b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef')]
  • 在文本相关性列中,数字会转换为字符串。
  • 在整数,实数和数字关联列中,包含数字的字符串将转换为数字。
  • 不包含数字的字符串仍然是字符串,即使在数字列中也是如此。
  • 无论列亲和力如何,Blob都会保持blob。
  • 在具有NONE亲和力的列中,按原样插入值。

答案 2 :(得分:1)

查看文档。 http://sqlite.org/datatype3.html

  

为了最大化SQLite和其他数据库之间的兼容性   SQLite支持列上的“类型亲和力”概念。   列的类型亲缘关系是存储数据的推荐类型   在那一栏。这里的重要思想是类型   推荐,不需要。任何列仍然可以存储任何类型的   数据。只是根据选择,某些列更愿意   使用一个存储类而不是另一个。 a的首选存储类   列被称为“亲和力”。

看起来他们正试图保持与其他DBMS的兼容性。

他们也希望能够做到以下几点:

  

...小浮点值,没有小数分量并存储在   具有REAL亲和力的列将作为整数写入磁盘   占用更少的空间并自动转换回浮动   在读出值时指向。

最终,列的亲和力由声明的列类型决定,因此这就是声明列类型的原因。