相关的SQLite数据类型如INT,INTEGER,SMALLINT和TINYINT有什么区别?

时间:2010-05-03 22:11:40

标签: sqlite

在SQLite3中创建表时,遇到所有可能的数据类型时,我会感到困惑,这些数据类型暗示内容相似,所以有人能告诉我以下数据类型之间的区别吗?

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

是否有某些文件列出了最小/最大值。各种数据类型的能力?例如,我猜smallint的最大值大于tinyint,但值小于整数,但我不知道这些容量是什么。

5 个答案:

答案 0 :(得分:92)

从技术上讲,

SQLite没有数据类型,在清单打字系统中有storage classes,是的,如果你习惯了传统的RDBMS es,那就太麻烦了。内部的所有内容都存储为文本。数据类型根据亲和力(ala数据类型分配给列)强制/转换为各种存储位置。

我建议你做的最好的事情是:

  1. 暂时忘记您以前了解的独立数据库数据类型

  2. SQLite网站阅读以上链接。

  3. 根据旧架构获取类型,并在SQLite

  4. 中查看它们的映射内容
  5. 将所有数据迁移到SQLite数据库。

  6. 注意:数据类型限制可能很麻烦,尤其是在SQL中添加持续时间,日期或具有该性质的事物时。对于那种事情,SQLite很少有内置函数。但是,SQLite确实提供了一种简单的方法,您可以通过sqlite3_create_function库函数创建自己的内置函数,以添加持续时间和此类事物。您可以使用该工具代替传统的存储过程。

答案 1 :(得分:46)

区别在于语法糖。只有少数类型名称的子字符串与类型亲和关系一样重要。

  • INT,INTEGER,SMALLINT,TINYINT→INTEGER affinity,因为它们都包含“INT”。
  • LONGCHAR,LONGVARCHAR→TEXT亲和力,因为它们包含“CHAR”。
  • DEC,DECIMAL,DATETIME,SMALLDATETIME→NUMERIC,因为它们不包含任何重要的子字符串。

确定亲和力的规则列于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)。
  • TEXTBLOB由预处理器宏确定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会将其存储为数字或否则就失败了。