INT,INTEGER,SMALLINT和TINYINT等相关的SQLite数据types有什么区别?
在SQLite3中创build一个表时,遇到所有可能的数据types意味着相似的内容时,我感到困惑,所以有谁能告诉我以下数据types之间的区别?
INT, INTEGER, SMALLINT, TINYINT DEC, DECIMAL LONGCHAR, LONGVARCHAR DATETIME, SMALLDATETIME
是否有一些文件列出了最小/最大。 各种数据types的能力? 例如,我猜smallint
的最大值比tinyint
,但比整数小一些,但我不知道这些容量是多less。
SQLite
技术上说, SQLite
没有数据types,在清单input系统中有存储类 ,是的,如果你习惯于传统的RDBMS
,这是令人困惑的。 内部的所有东西都以文本forms存储。 数据types根据亲和性(分配给列的数据types)被强制/转换成各种存储位置。
我build议你做的最好的事情是:
-
暂时忘记你以前了解的有关独立数据库数据types的所有信息
-
从
SQLite
网站阅读上述链接。 -
根据旧的模式获取types,并查看他们将在
SQLite
映射的内容 -
将所有的数据迁移到
SQLite
数据库。
注意:数据types限制可能很麻烦,特别是如果您在SQL
添加持续时间,date或者这种性质的事情。 SQLite
有这样的东西很less内置函数。 但是, SQLite
通过sqlite3_create_function
库函数为您提供了一种简单的方法来创build自己的内置函数,用于添加持续时间和特性。 您将使用该工具来代替传统的存储过程。
不同的是语法糖。 只有types名称的几个子string与types亲和性有关。
- INT,INTEGER,SMALLINT,TINYINT→INTEGER亲和力,因为它们都包含“INT”。
- LONGCHAR,LONGVARCHAR→TEXT亲和力,因为它们包含“CHAR”。
- DEC,DECIMAL,DATETIME,SMALLDATETIME→NUMERIC,因为它们不包含任何重要的子string。
确定亲和力的规则在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) );
但我从来不打扰它。
至于每种types的容量:
-
INTEGER
总是被签名为64位。 请注意,SQLite优化了幕后的小整数存储 ,所以TINYINT不会有用。 -
REAL
总是64位(double
)。 -
TEXT
和BLOB
的最大大小由预处理器macros决定,默认为1,000,000,000字节。
这些大多数是为了兼容性。 你真的只有整数,浮点数,文本和blob。 date可以存储为一个数字(unix时间是整数,微软时间是浮动)或作为文本。
NULL
。 该值是一个NULL值。
INTEGER
。 该值是一个有符号的整数,根据值的大小存储在1,2,3,4,6或8个字节中。
REAL
。 该值是一个浮点值,以8个字节的IEEE浮点数存储。
TEXT
。 该值是一个文本string,使用数据库编码(UTF-8,UTF-16BE或UTF-16LE)存储。
BLOB
。 该值是一个数据块,完全按照input进行存储。
作为dan04的补充,如果你想盲目地插入一个由TEXT
表示的零以外的NUMERIC
,但是确保文本可以转换为数字:
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时将被转义并引用为string。 但是,由于我们没有通过TYPEOF
明确地检查types,而只能转换为types ,所以它仍然可以按需要工作(即,SQLite将把它存储为数字,否则失败)。