小。速度很快。可靠。
选择任意三个选项。

SQLite版本2中的数据类型

1.0无字体

SQLite是“无类型”的。这意味着您可以存储任何在任何表的任何列中需要的数据类型,无论声明了该列的数据类型。(请参阅下面第2.0节中此规则的一个例外。)此行为是一个功能,而不是臭虫。数据库应该存储和检索数据对于数据库来说,数据的格式不重要。大多数其他SQL引擎和SQL语言规范中的编码是一个错误特性-这是一个实现示例,显示了接口。SQLite试图通过允许您可以将任何类型的数据存储到任何类型的列中允许数据类型规范的灵活性。

SQLite的数据类型是零个或多个名称的任意序列可选地,后面跟着一个或两个带括号的列表有符号整数。特别注意,数据类型可以或更多名称。这意味着一个空的就SQLite而言,字符串是有效的数据类型。因此,您可以声明表,其中每个列的数据类型未指定,如下所示:

创建表ex1(a,b,c);

即使SQLite允许省略数据类型在CREATE TABLE语句中包含它仍然是一个好主意,因为数据类型通常是对其他程序员了解您打算在专栏中放置什么。而且如果您将代码移植到另一个数据库引擎其他引擎可能需要某种数据类型。SQLite接受所有常用的数据类型。例如:

创建表格ex2(VARCHAR(10),b NVARCHAR(15),c文本,d整数,e浮动,f布尔安,g克隆抗体,h堵塞,i时间戳,j数字(10,5)k可变字符(24),l民族性格差异(16));

等等。基本上任何名称序列都可以选择后跟括号中的一个或两个有符号整数就可以了。

2.0集成主键

SQLite的无类型性的一个例外是其类型为是整数主键。(并且必须使用“INTEGER”而不是“INT”。INT PRIMARY KEY类型的列与其他列一样是无类型的。)INTEGER PRIMARY KEY列必须包含32位有符号整数。任何尝试插入非整数数据将导致错误。

INTEGER PRIMARY KEY列可用于实现等效的自动删除。如果尝试将NULL插入INTEGER PRIMARYKEY列,该列实际上将填充一个整数,该整数为比表中已有的最大键大一个。或者如果最大键为2147483647,则该列将填充一个随机整数。无论哪种方式,INTEGER PRIMARY KEY列都是分配了一个唯一的整数。可以使用检索此整数这个sqlite_last_insert_rowid()API函数或使用last_insert_rowid()后续SELECT语句中的SQL函数。

3.0比较和排序

SQLite是无类型的,用于决定允许哪些数据存储在列中。但类型的一些概念起了作用排序和比较数据时。出于这些目的,列或表达式可以是以下两种类型之一:数字文本.排序或比较可能会给出不同的结果,具体取决于正在排序或比较的数据类型。

如果数据为类型文本那么比较是由标准C数据比较函数memcmp()strcmp()。比较查看来自两个输入的字节乘以1并返回第一个非零差值。字符串以“\000”结尾,因此更短如您所料,字符串在长字符串之前排序。

对于数字数据,这种情况更为复杂。如果两个输入看起来像格式良好的数字,然后进行转换使用转换为浮点值atof()并进行了数值比较。如果一个输入不是格式良好的数字,但另一个是,则number被认为小于非number。如果没有输入那么是一个格式正确的数字strcmp()用于执行比较。

不要被列可能具有“数字”这一事实所迷惑数据类型。这并不意味着列只能包含数字。这仅仅意味着如果列中包含数字,则该数字将按数字顺序排序。

对于文本和数值,NULL在任何其他值之前排序。使用“<”或““>=”总是false。

4.0 SQLite如何确定数据类型

对于SQLite 2.6.3及更早版本,所有值都使用数字数据类型。文本数据类型出现在2.7.0及更高版本中。在续集中假设您使用的是2.7.0或更高版本的SQLite。

对于表达式,结果的数据类型通常由最外层的操作员。例如,算术运算符(“+”、“*”、“%”)始终返回数字结果。字符串串联运算符(“||”)返回一个文本结果。等等。如果你有任何疑问关于表达式的数据类型,可以使用特殊typeof()用于确定数据类型的SQL函数。例如:

sqlite>SELECT typeof('abc'+123);数字sqlite>选择类型('abc'||123);文本

对于表列,数据类型由类型声明确定CREATE TABLE语句的。当且仅当类型声明包含以下一个或多个字符串:

BLOB(博客)
烧焦
CLOB公司
文本

在类型声明中搜索这些字符串不区分大小写,当然。如果上述任何字符串出现在类型中的任何位置声明,则该列的数据类型为文本。请注意类型“VARCHAR”包含“CHAR”作为子字符串,因此将其视为文本。

如果类型声明中没有出现上述字符串,那么数据类型是数字。特别注意,列的数据类型带有空类型的声明是数字的。

5.0示例

考虑以下两个命令序列:

创建表t1(唯一整数);创建表t2(b文本唯一);插入t1值('0');插入t2值(0);插入t1值('0.0');插入t2值(0.0);

按照左边的顺序,第二次插入将失败。在这种情况下,字符串“0”和“0.0”被视为数字,因为它们是插入到数值列中,但0==0.0违反了唯一性约束。但是,右侧序列中的第二个插入操作有效。在这种情况下,常量0和0.0被视为字符串,这意味着它们是不同的。

SQLite总是将数字转换为双精度(64位)浮点用于比较目的。这意味着一长串数字仅在无关紧要的数字上的差异将比较相等,如果它们在数字列中,但如果在文本中,则比较不相等列。我们有:

插入t1插入t2价值(‘12345678901234567890’);价值(12345678901234567890);插入t1插入t2价值(‘12345678901234567891’);值(12345678901234567891);

与前面一样,左侧的第二个插入将失败,因为比较将首先将两个字符串转换为浮点数字符串中的差异在第20位,超过了分辨率64位浮点。相反,右侧的第二个插入将起作用因为在这种情况下,插入的数字是字符串使用memcmp()进行比较。

数字和文本类型也会对DISTINCT关键字产生影响:

创建表t3(一个整数);创建表t4(b文本);插入t3值('0');插入t4值(0);插入t3值('0.0');插入t4值(0.0);从t3中选择DISTINCT*;从t4中选择DISTINCT*;

左侧的SELECT语句返回自“0”和“0.0”以来的一行被视为数字,因此是模糊的。但选择右边的语句返回两行,因为处理了0和0.0不同的字符串。

此页面上次修改时间2022-01-08 05:02:57联合技术公司