如果sqlite是无类型的,为什么我们声明列的数据类型? declare数据类型有什么用?
Why android SQLite can store double value(java 8 bytes) into float column
答案 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')]
答案 2 :(得分:1)
查看文档。 http://sqlite.org/datatype3.html
为了最大化SQLite和其他数据库之间的兼容性 SQLite支持列上的“类型亲和力”概念。 列的类型亲缘关系是存储数据的推荐类型 在那一栏。这里的重要思想是类型 推荐,不需要。任何列仍然可以存储任何类型的 数据。只是根据选择,某些列更愿意 使用一个存储类而不是另一个。 a的首选存储类 列被称为“亲和力”。
看起来他们正试图保持与其他DBMS的兼容性。
他们也希望能够做到以下几点:
...小浮点值,没有小数分量并存储在 具有REAL亲和力的列将作为整数写入磁盘 占用更少的空间并自动转换回浮动 在读出值时指向。
最终,列的亲和力由声明的列类型决定,因此这就是声明列类型的原因。