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议你做的最好的事情是:

  1. 暂时忘记你以前了解的有关独立数据库数据types的所有信息

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

  3. 根据旧的模式获取types,并查看他们将在SQLite映射的内容

  4. 将所有的数据迁移到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 )。
  • TEXTBLOB的最大大小由预处理器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将把它存储为数字,否则失败)。