SQLite 使用的是一个更加普通的动态类型系统。在 SQLite 中,数据类型的值是与值的本身有关联,而不是它的容器。SQLite 的动态类型系统对于更多其它数据库引擎常见的静态类型系统是向后兼容的,在这个意义上,工作在静态类型数据库上的 SQL 语句同样也能工作在 SQLite 中。然而,SQLite 中的动态类型允许它做一些在传统严格类型数据库中不能做的事情。
因为SQLite是动态类型系统,所以可以指定任意的存储类型,这样意味着它有着良好的兼容性,你的[b]Oracle语句几乎可以一丝不改的在SQLite上执行[/b](不包括序列等),同时你也会发现它比静态类型数据库要慢的多。动态类型系统是SQLite的优点,也是它的缺点。
大多数 SQL 数据库引擎(据我们所知的、SQLite 以外的所有 SQL 数据库引擎)使用静态的、严格的类型。对于静态类型,数据类型的值由它的容器(存储值的特定列)来决定。
存储在 SQLite 数据库中的每个值(或者由数据库引擎操纵的值)都是以下的存储类之一:
NULL 该值是一个 NULL 值
INTEGER 该值是一个有符号的整数,根据值的大小,存储 1、2、3、4、5、6 或 8 字节内容
REAL 该值是一个浮点值,存储一个 8 字节的 IEEE 浮点数
TEXT 该值是一个文本字符串,使用数据库编码(UTF-8、 UTF-16BE 或 UTF-16LE)进行存储
BLOB 该值是一个数据块,按照它的输入直接存储
注意,一个存储类要略普遍于一个数据类型。INTEGER 存储类,例如,包含不同长度的 6 个不同的整数类型。这在磁盘上是不同的。但是一旦 INTEGER 值从磁盘读取到内存进行处理,它们都将被转换为最普通的数据类型(8 字节有符号的整数)。因此大部分“存储类”是无异于“数据类型”的,并且有 2 个条款能被互换地使用。
在一个 SQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以被用来存储一个任意存储类的值。
SQL 语句中的所有值,无论它们是嵌入在 SQL 语句文本里的字面量,还是绑定到预编译 SQL 语句的参数,都有一个内在存储类。在以下描述的情况中,数据库引擎会在执行查询过程中,在数字存储类(INTEGER 和 REAL)和 TEXT 之间进行转换。
因为SQLite是动态类型系统,所以可以指定任意的存储类型,这样意味着它有着良好的兼容性,你的[b]Oracle语句几乎可以一丝不改的在SQLite上执行[/b](不包括序列等),同时你也会发现它比静态类型数据库要慢的多。动态类型系统是SQLite的优点,也是它的缺点。
大多数 SQL 数据库引擎(据我们所知的、SQLite 以外的所有 SQL 数据库引擎)使用静态的、严格的类型。对于静态类型,数据类型的值由它的容器(存储值的特定列)来决定。
存储在 SQLite 数据库中的每个值(或者由数据库引擎操纵的值)都是以下的存储类之一:
NULL 该值是一个 NULL 值
INTEGER 该值是一个有符号的整数,根据值的大小,存储 1、2、3、4、5、6 或 8 字节内容
REAL 该值是一个浮点值,存储一个 8 字节的 IEEE 浮点数
TEXT 该值是一个文本字符串,使用数据库编码(UTF-8、 UTF-16BE 或 UTF-16LE)进行存储
BLOB 该值是一个数据块,按照它的输入直接存储
注意,一个存储类要略普遍于一个数据类型。INTEGER 存储类,例如,包含不同长度的 6 个不同的整数类型。这在磁盘上是不同的。但是一旦 INTEGER 值从磁盘读取到内存进行处理,它们都将被转换为最普通的数据类型(8 字节有符号的整数)。因此大部分“存储类”是无异于“数据类型”的,并且有 2 个条款能被互换地使用。
在一个 SQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以被用来存储一个任意存储类的值。
SQL 语句中的所有值,无论它们是嵌入在 SQL 语句文本里的字面量,还是绑定到预编译 SQL 语句的参数,都有一个内在存储类。在以下描述的情况中,数据库引擎会在执行查询过程中,在数字存储类(INTEGER 和 REAL)和 TEXT 之间进行转换。
本文介绍了SQLite数据库采用的动态类型系统特点,与静态类型系统的区别,以及如何支持多种数据存储类型,包括NULL、INTEGER、REAL、TEXT和BLOB。探讨了这种设计带来的灵活性及其潜在的性能影响。

被折叠的 条评论
为什么被折叠?



