在SQLite3中创建表时,遇到所有可能的数据类型时,我会感到困惑,这些数据类型暗示内容相似,所以有人能告诉我以下数据类型之间的区别吗?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
是否有某些文件列出了最小/最大值。各种数据类型的能力?例如,我猜smallint
的最大值大于tinyint
,但值小于整数,但我不知道这些容量是什么。
答案 0 :(得分:92)
SQLite
没有数据类型,在清单打字系统中有storage classes,是的,如果你习惯了传统的RDBMS
es,那就太麻烦了。内部的所有内容都存储为文本。数据类型根据亲和力(ala数据类型分配给列)强制/转换为各种存储位置。
我建议你做的最好的事情是:
暂时忘记您以前了解的独立数据库数据类型
从SQLite
网站阅读以上链接。
根据旧架构获取类型,并在SQLite
将所有数据迁移到SQLite
数据库。
注意:数据类型限制可能很麻烦,尤其是在SQL
中添加持续时间,日期或具有该性质的事物时。对于那种事情,SQLite
很少有内置函数。但是,SQLite
确实提供了一种简单的方法,您可以通过sqlite3_create_function
库函数创建自己的内置函数,以添加持续时间和此类事物。您可以使用该工具代替传统的存储过程。
答案 1 :(得分:46)
区别在于语法糖。只有少数类型名称的子字符串与类型亲和关系一样重要。
确定亲和力的规则列于SQLite site。
如果坚持严格打字,您可以使用CHECK
约束来实现
CREATE TABLE T (
N INTEGER CHECK(TYPEOF(N) = 'integer'),
Str TEXT CHECK(TYPEOF(Str) = 'text'),
Dt DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);
但我从不打扰它。
关于每种类型的容量:
INTEGER
始终是64位签名。请注意,SQLite优化了幕后小整数的storage,因此TINYINT无论如何都不会有用。REAL
始终为64位(double
)。TEXT
和BLOB
由预处理器宏确定maximum size,默认为1,000,000,000字节。答案 2 :(得分:10)
大多数都是为了兼容性。你真的只有整数,浮点数,文本和blob。日期可以存储为数字(unix时间是整数,微软时间是浮点数)或文本。
答案 3 :(得分:3)
NULL
。该值为NULL值。
INTEGER
。该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。
REAL
。该值是浮点值,存储为8字节IEEE浮点数。
TEXT
。该值是一个文本字符串,使用数据库编码(UTF-8,UTF-16BE或UTF-16LE)存储。
BLOB
。该值是一个数据块,完全按照输入的方式存储。
答案 4 :(得分:1)
作为dan04回答的补充,如果您想盲目地插入由NUMERIC
代表的零以外的TEXT
,但要确保文本可转换为数字:
your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)
典型的用例是来自程序的查询,该程序将所有数据视为文本(为了统一性和简单性,因为SQLite已经这样做了)。关于这个的好处是它允许这样的结构:
INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)
如果您使用占位符,则非常方便,因为您不必专门处理此类非零数字字段。使用Python的sqlite3
模块的示例是,
conn_or_cursor.execute(
"INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",
str_value_tuple) # no need to convert some from str to int/float
在上面的示例中,str_value_tuple
中的所有值都将被转义并在传递给SQlite时作为字符串引用。但是,由于我们不是通过TYPEOF
明确检查类型,而只是可转换为类型,因此它仍可按预期工作(即,SQLite会将其存储为数字或否则就失败了。