在SQLite3中创建表时,遇到所有暗示相似内容的数据类型时,我会感到困惑,所以有人能告诉我以下数据类型之间的区别吗?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
是否有一些文档列出了最小/最大。各种数据类型的容量?例如,我猜smallint
它的最大值大于tinyint
,但值小于整数,但是我不知道这些容量是多少。
在SQLite3中创建表时,遇到所有暗示相似内容的数据类型时,我会感到困惑,所以有人能告诉我以下数据类型之间的区别吗?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
是否有一些文档列出了最小/最大。各种数据类型的容量?例如,我猜smallint
它的最大值大于tinyint
,但值小于整数,但是我不知道这些容量是多少。
Answers:
SQLite
,从技术上讲,它没有数据类型,清单类型系统中有存储类,是的,如果您习惯于传统RDBMS
es ,这会令人困惑。内部的所有内容都存储为文本。根据关联性(分配给列的ala数据类型),将数据类型强制/转换为各种存储位置。
我建议您做的最好的事情是:
暂时忘记您曾经了解的有关独立数据库数据类型的所有信息
从SQLite
网站上阅读以上链接。
从旧模式中获取类型,然后查看它们要映射到的内容 SQLite
将所有数据迁移到SQLite
数据库。
注意:数据类型的限制可能很麻烦,尤其是如果您在中添加了持续时间或日期或类似性质的内容时SQL
。SQLite
几乎没有内置函数可用于此类操作。但是,SQLite
确实为您提供了一种简单的方法,使您可以通过sqlite3_create_function
库函数制作自己的内置函数来添加持续时间和类似性质的内容。您将使用该功能代替传统的存储过程。
DATE
或可能会很有用BOOLEAN
,但是我不会费心区分不同大小的整数。对于的情况尤其如此,在这种情况INTEGER PRIMARY KEY
下,确切的类型名称很重要。
区别在于语法糖。就类型相似性而言,类型名称中只有几个子字符串很重要。
SQLite网站上列出了用于确定亲和力的规则。
如果您坚持严格输入,则可以使用CHECK
约束来实现:
CREATE TABLE T (
N INTEGER CHECK(TYPEOF(N) = 'integer'),
Str TEXT CHECK(TYPEOF(Str) = 'text'),
Dt DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);
但是我从来没有理会它。
至于每种类型的容量:
TYPEOF
。因此,尝试插入将由SQlite转换为NUMERIC / INTEGER存储类的TEXT的尝试(即,按照sqlite.org/datatype3.html#affinity进行的这种转换是无损的)会失败。换句话说,这种方法比插入值然后通过某种方式神奇地验证SQLite用来存储该值的存储类的临时方法更为严格。有关更宽松的方法,请参见下面的答案。
作为对dan04的补充,如果您想盲目插入a 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
在上面的示例中,in中的所有值在str_value_tuple
传递给SQlite时都将转义并引用为字符串。但是,由于我们不是通过显式检查类型,TYPEOF
而仅是对type的可转换性,所以它仍将按需运行(即,SQLite会将其存储为数字,否则将失败)。