Java SQLite是无类型的吗?

Java SQLite是无类型的吗?,java,android,sqlite,Java,Android,Sqlite,如果sqlite是无类型的,那么为什么我们要声明列的数据类型呢?declare数据类型有什么用途 声明的列数据类型用作提示(http://sqlite.org/faq.html#q3): 因此,例如,如果一个列的类型是INTEGER,并且您试图在该列中插入一个字符串,SQLite将尝试将该字符串转换为整数。如果可以,则插入整数。如果不是,则插入字符串。此功能称为类型关联 顺便说一下,SQLite不是无类型的;它使用动态类型。这意味着您插入的任何值都会维护自己的类型信息,而不是从表声明中推断类型

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


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

因此,例如,如果一个列的类型是INTEGER,并且您试图在该列中插入一个字符串,SQLite将尝试将该字符串转换为整数。如果可以,则插入整数。如果不是,则插入字符串。此功能称为类型关联


顺便说一下,SQLite不是无类型的;它使用动态类型。这意味着您插入的任何值都会维护自己的类型信息,而不是从表声明中推断类型

查看文档

为了最大化SQLite和其他数据库之间的兼容性 引擎,SQLite支持列上的“类型关联”概念。 列的类型关联是存储数据的建议类型 在那个专栏里。这里的重要思想是类型是 推荐,非必需。任何列仍然可以存储任何类型的 数据。只是有些专栏,如果有选择的话,会倾向于 使用一个存储类而不是另一个存储类。a的首选存储类 列被称为它的“亲和性”

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

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

…不含小数成分的小浮点值,存储在 具有实关联的列作为整数写入磁盘,以便 占用更少的空间,并自动转换回浮动 读取值时的点


最后,列的关联性由声明的列类型决定,这就是为什么要声明列的类型。

它用于确定列的“关联性”

CREATE TABLE Example (
    IntegerAffinity    INTEGER,
    RealAffinitity     REAL,
    NumericAffinity    NUMERIC,
    TextAffinity       TEXT,
    NoAffinity
);
在该表中插入一些值(使用Python的
sqlite3
模块)将给出:

  • 在文本关联列中,数字转换为字符串
  • 在整数、实数和数值关联列中,包含数字的字符串将转换为数字
  • 不包含数字的字符串仍然是字符串,即使在数字列中也是如此
  • BLOB仍然是BLOB,而与列关联无关
  • 在没有关联的列中,值按原样插入
他们也会这样做,然后通过添加文本和数字类型基本上承认他们错了!
>>> 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')]