SQLite 数据类型
                           
天天向上
发布: 2025-03-04 08:28:03

原创
349 人浏览过

SQLite 使用 动态类型,不同于传统的 SQL 数据库(如 MySQL、PostgreSQL)使用的静态类型。在 SQLite 中,一个列可以存储不同类型的数据,而不像 MySQL 那样严格限制。


1. SQLite 的存储类

SQLite 只有 五种存储类(Storage Classes),而不是传统 SQL 数据库的多个数据类型:

存储类说明
NULL该值为空值(NULL)。
INTEGER有符号整数(1、2、3、100等),占用 1、2、3、4、6 或 8 字节。
REAL浮点数(小数),使用 8 字节存储。
TEXT文本字符串,UTF-8、UTF-16 编码。
BLOB二进制数据,存储为输入格式,适用于图片、文件等。

2. SQLite 的数据类型(类型亲和性)

SQLite 没有严格的数据类型,但它提供了一种类型亲和性(Type Affinity),用于保证数据存储的合理性。

SQLite 允许你在 CREATE TABLE 语句中指定数据类型,但这些类型会被映射到存储类。例如:

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    balance REAL,
    profile BLOB
);

在 SQLite 内部,INTEGERREALTEXTBLOB 实际上会映射到存储类。

SQLite 类型亲和性规则

SQLite 识别的数据类型会映射到五种存储类:

指定的数据类型亲和类型(Affinity)
INT, INTEGER, BIGINT, TINYINTINTEGER
REAL, FLOAT, DOUBLE, NUMERICREAL
CHAR, TEXT, VARCHAR, CLOBTEXT
BLOBBLOB
BOOLEAN, DATE, DATETIMENUMERIC

例如:

CREATE TABLE test (
    col1 INT,        -- INTEGER
    col2 VARCHAR(50), -- TEXT
    col3 BOOLEAN,     -- NUMERIC
    col4 REAL,        -- REAL
    col5 BLOB         -- BLOB
);

在 SQLite 中:

  • col1 会被视为 INTEGER,即使你写的是 INT
  • col2 会被视为 TEXT,即使你写的是 VARCHAR(50)
  • col3 会被视为 NUMERIC,但实际上 SQLite 仍允许存储整数。
  • col4 会被视为 REAL,用于存储浮点数。
  • col5 直接存储二进制数据。

3. SQLite 特殊数据类型

SQLite 支持一些特殊数据类型,尽管它们仍然映射到五种存储类之一。

(1) BOOLEAN(布尔值)

SQLite 没有 BOOLEAN 类型,但可以用 INTEGER 存储:

CREATE TABLE settings (
    id INTEGER PRIMARY KEY,
    is_enabled BOOLEAN -- 实际存储为 INTEGER
);
  • 0 代表 FALSE
  • 1 代表 TRUE

(2) DATE 和 DATETIME(日期和时间)

SQLite 没有 DATEDATETIME 类型,但可以存储为 TEXTINTEGERREAL

CREATE TABLE events (
    id INTEGER PRIMARY KEY,
    event_name TEXT,
    event_date TEXT  -- 可以存储 '2025-03-04'
);

SQLite 处理日期的方法:

  • TEXT(推荐):'YYYY-MM-DD HH:MM:SS' 格式
  • REAL:存储 自 1970-01-01 以来的天数
  • INTEGER:存储 UNIX 时间戳(秒数)

插入日期

INSERT INTO events (event_name, event_date) VALUES ('Meeting', '2025-03-04 10:30:00');
INSERT INTO events (event_name, event_date) VALUES ('Conference', strftime('%Y-%m-%d %H:%M:%S', 'now'));

查询日期

SELECT * FROM events WHERE event_date > datetime('now', '-1 day');

4. SQLite 动态数据存储

SQLite 不强制列的数据类型,例如:

CREATE TABLE test (col1 INTEGER);
INSERT INTO test (col1) VALUES ('Hello'); -- 允许插入字符串
SELECT * FROM test;

SQLite 不会报错,但会根据存储类来存储数据:

  • col1 设为 INTEGER,但仍然可以存储字符串 "Hello",会按 TEXT 处理。
  • 但如果 col1 设为 INTEGER PRIMARY KEY,则不能存储字符串。

5. SQLite 类型转换

SQLite 在存储和查询时可能会转换数据类型:

SELECT CAST('123' AS INTEGER); -- 返回 123
SELECT CAST(123 AS TEXT);      -- 返回 '123'
SELECT CAST('3.14' AS REAL);   -- 返回 3.14

6. SQLite 数据类型 vs 传统数据库

数据类型SQLite 存储类MySQLPostgreSQL
INTEGERINTEGERTINYINTSMALLINTMEDIUMINTBIGINTSMALLINTBIGINT
REALREALFLOATDOUBLEFLOATDOUBLE PRECISION
TEXTTEXTVARCHAR(n)TEXTVARCHAR(n)TEXT
BLOBBLOBBLOBBYTEA
BOOLEANNUMERIC(0/1)TINYINT(1)BOOLEAN
DATE/DATETIMETEXT/INTEGER/REALDATETIMETIMESTAMP

7. 什么时候使用 SQLite 的数据类型

  • 存储整数 → 使用 INTEGER
  • 存储小数 → 使用 REAL
  • 存储文本 → 使用 TEXT
  • 存储二进制文件(图片、音频等) → 使用 BLOB
  • 存储日期/时间 → 使用 TEXTINTEGER(UNIX 时间戳)

总结

  1. SQLite 只有 5 种存储类:NULLINTEGERREALTEXTBLOB
  2. SQLite 不强制数据类型,但有类型亲和性
  3. BOOLEANDATEDATETIME 实际上会映射到 NUMERICTEXT
  4. SQLite 支持动态数据存储,可以存储不同类型的数据,但建议遵循类型亲和性。
  5. 适当使用 CAST() 进行数据类型转换。

更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *