SQLite3的数据类型

原文请戳这里
原翻译请戳这里

Most SQL database engines (every SQL database engine other than SQLite, as far as we know) uses static, rigid typing. With static typing, the datatype of a value is determined by its container - the particular column in which the value is stored.
大多数 SQL 数据库引擎 (据我们所知,除 SQLite 之外的所有 SQL 数据库引擎)都使用严格的静态类型。使用静态类型,值的类型便由它的容器 – 存储值的特定的列 – 来决定。

SQLite uses a more general dynamic type system. In SQLite, the datatype of a value is associated with the value itself, not with its container. The dynamic type system of SQLite is backwards compatible with the more common static type systems of other database engines in the sense that SQL statements that work on statically typed databases should work the same way in SQLite. However, the dynamic typing in SQLite allows it to do things which are not possible in traditional rigidly typed databases.
SQLite 使用更通用的动态类型系统。在 SQLit 中,值的数据类型与值本身相关,而不是与它的容器。SQLite 的动态类型系统与其它数据库引擎的常用静态类型系统是向后兼容的,在这个意义上,工作在静态类型数据库上的 SQL 语句应该以同样的方式工作在 SQLite 中。然而,SQLite 中的动态类型允许它做传统的严格类型的数据库所不能做的事。

1.0 Storage Classes and Datatypes

1.0 存储类型与数据类型

Each value stored in an SQLite database (or manipulated by the database engine) has one of the following storage classes:
存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型

NULL. The value is a NULL value.
NULL. 值是空值。

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
INTEGER. 值是有符号整数,根据值的大小以1,2,3,4,6 或8字节存储。

REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
REAL. 值是浮点数,以8字节 IEEE 浮点数存储

TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
TEXT. 值是文本字符串,使用数据库编码(UTF-8, UTF-16BE 或 UTF-16LE)进行存储。

BLOB. The value is a blob of data, stored exactly as it was input.
BLOB. 值是一个数据块,按它的输入原样存储。

Note that a storage class is slightly more general than a datatype. The INTEGER storage class, for example, includes 6 different integer datatypes of different lengths. This makes a difference on disk. But as soon as INTEGER values are read off of disk and into memory for processing, they are converted to the most general datatype (8-byte signed integer). And so for the most part, “storage class” is indistinguishable from “datatype” and the two terms can be used interchangeably.
注意,存储类型比数据类型更笼统。以 INTEGER 存储类型为例,它包括6种不同的长度不等的整数类型,这在磁盘上是不同的。但是只要 INTEGER 值从磁盘读取到内存进行处理,它们就被转换为更为一般的数据类型(8字节有符号整型)。因此在一般情况下,“存储类型” 与 “数据类型” 没什么差别,这两个术语可以互换使用。

Any column in an SQLite version 3 database, except an INTEGER PRIMARY KEY column, may be used to store a value of any storage class.
SQLite 版本3数据库中的任何列,除了整型主键列,都可用于存储任何存储类型的值。

All values in SQL statements, whether they are literals embedded in SQL statement text or parameters bound to precompiled SQL statements have an implicit storage class. Under circumstances described below, the database engine may convert values between numeric storage classes (INTEGER and REAL) and TEXT during query execution.
SQL 语句中的任何值,无论它们是嵌入到 SQL 语句中的字面量还是绑定到预编译 SQL 语句中的参数,都有一个隐含的存储类型。在下述情况下,数据库引擎会在执行查询时在数值存储类型(INTEGER 和 REAL)和 TEXT 之间进行转换。

### SQLite3 数据类型及其用法 SQLite3 虽然允许忽略数据类型,但在 `CREATE TABLE` 语句中指定数据类型有助于提高程序的可读性和维护性[^1]。SQLite 支持多种常用的数据类型,并通过亲和关系(Affinity)来指导数据存储方式[^2]。 #### 常见数据类型 以下是 SQLite 中常见且推荐使用的数据类型: - **INTEGER**: 存储整数值。 ```sql CREATE TABLE example ( id INTEGER PRIMARY KEY, value INT NOT NULL ); ``` - **REAL (FLOAT)**: 存储浮点数。 ```sql CREATE TABLE measurements ( measurement_id INTEGER PRIMARY KEY, temperature REAL ); ``` - **TEXT**: 存储字符串或文本数据。 ```sql CREATE TABLE users ( user_id INTEGER PRIMARY KEY, username TEXT UNIQUE NOT NULL ); ``` - **BLOB**: 存储二进制大对象,适合保存图片或其他二进制文件。 ```sql CREATE TABLE images ( image_id INTEGER PRIMARY KEY, data BLOB ); ``` - **NULL**: 表示缺失值,在字段定义时不常显式声明。 - **BOOLEAN**: 实际上并不存在布尔类型的独立实现;通常使用 INTEGER 来模拟布尔逻辑,其中 0 表示假而任何非零值表示真。 ```sql CREATE TABLE settings ( setting_name TEXT PRIMARY KEY, is_enabled INTEGER CHECK(is_enabled IN (0, 1)) ); ``` 对于时间戳和其他日期/时间信息,尽管 SQL92 标准中有相应的类型SQLite 并不直接支持特定的时间戳类型[TIMESTAMP],而是可以通过 TEXT、REAL 或 INTEGER 类型配合函数处理日期时间和时间间隔。 #### 创建表格实例 下面是一个综合运用上述几种基本类型的例子: ```sql -- 连接到名为 'example.db' 的 SQLite 数据库 conn = sqlite3.connect('example.db') -- 定义一个新的表结构 CREATE TABLE IF NOT EXISTS employees ( employee_id INTEGER PRIMARY KEY AUTOINCREMENT, first_name TEXT NOT NULL, last_name TEXT NOT NULL, hire_date DATE, -- 使用 TEXT 类型存储 ISO8601 字符串形式的日期 salary REAL, department_id INTEGER REFERENCES departments(department_id), photo BLOB ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值