在SQLite数据类型的详细解释

在SQLite数据类型的详细解释
大多数的SQL数据库引擎(据我们所知,所有的SQL数据库引擎SQLite使用除外)严格的静态类型。使用静态类型的值的类型是由它的容器所决定,所存储的值的特定列。

SQLite使用更通用的动态类型系统。在SQLit,一个值的数据类型是值本身有关,不与它的容器。SQLite的动态类型系统是向后兼容其他数据库引擎其他静态类型系统。在这个意义上,SQL语句对数据库工作静态类型应该在SQLite以同样的方式工作。然而,在SQLite的动态类型允许它做什么传统,严格类型的数据库不能做。

1存储类型和数据类型

每个值存储在SQLite数据库(或值由数据库引擎操作的)下面有一个存储类型:

空。值是空值。
整数。值是一个带符号整数,它根据值的大小存储在1, 2, 3、4, 6或8字节中。
真正的。值是一个浮点数,用一个8字节的IEEE浮点数存储。
文本。价值是一个文本字符串,这是使用数据库存储(UTF-16BE,UTF-8编码,或UTF-16LE)。
斑点。值是一个数据块,它存储在输入示例中。
请注意,存储类型比数据类型更加普遍。以整数的存储类型为例,包括不同长度的6个不同的整数类型,它在磁盘上的不同。但只要整数的值是从内存中读取处理,它们都转换成更多的通用数据类型(8字节的符号的整数)。因此,在一般情况下,有存储类型和数据类型没有区别,这两个术语可以交替使用。

在SQLite 3版数据库的任何列可以存储任何价值除了整型主键列的存储类型。

SQL语句中的任何值,无论是嵌入的SQL语句或是绑定到预编译的SQL语句的参数,有一个隐式存储类型。在下列情况下,数据库引擎将数字存储类型之间(整数和实数)和查询执行过程中的文本。

1.1布尔型

SQLite没有单独的布尔存储类型,但是商店的布尔值为整数0(假)和1(真的)。

1.2日期和时间类型

SQLite没有另一个存储类型存储日期和时间。SQLite内置的日期和时间函数可以保存日期和时间作为文本,真实的,或整数值:

文本字符串(HH ISO8601日期:MM:SS、SSS )。
真正的朱利安日数(Julian Day数),根据公历,自格林尼治时间11月24日格林尼治时间4714日。
整数Unix时间,自1970-01-01 00:00:00 UTC的秒数。
应用程序可以选择这些格式中的任何存储日期和时间,并使用内置的日期和时间函数在这些格式之间自由转换。

2种亲和力

为了最大限度地提高SQLite等数据库引擎之间的兼容性,SQLite支持的柱型亲和的概念。对柱亲和类型推荐数据存储在列的类型。这里重要的思想是类推荐,没有必要的。任何列可以存储任何类型的数据。这只是让一些列有选择性地使用某种存储类型。一列优先存储类型称为亲和。

在每个数据库SQLite 3列是归因于下列类型之一的亲和力:

文本
数字
整数
真正的
没有
具有文本关联的列使用存储类型null、文本或数据块存储所有数据。如果数字数据插入具有文本关联的列中,则在存储之前将数据转换为文本形式。

该数字亲和柱可能包含所有五个存储类的值。当插入文本数据的数值列的文本存储类型转换为整数或实数(优先优先)如果这种转变是无损或可逆的。对于文本和实数类型之间的转换,如果15个重要的小数位数保留,SQLite认为转型是无损的和可逆的。如果文本不能转化为整数或实数,该值将被存储在一个文本类型。不要试图把空或BLOB值。

一个字符串可能看起来像小数点和/或指数浮点文字,但只要值可以表示为一个整数,数值的亲和力,将它改造成一个整数。因此,字符串3.0e + 5列中存储的整数形式300000数值的亲和力而不是一个浮点值30000。
使用整数亲和性的列与数字亲和性列表一致。只有在表达式中,它们之间的区别是明显的。

除了力的整数值为浮点数表示法,一个真正的亲和柱(数值亲和力的一列相同的内部优化,为了占据更少的空间,没有小数部分,存储在房柱亲和小浮点值的整数形式的磁盘,自动读取转换回浮点值。在SQL级,这种优化是完全不可见的,只能检测通过检查原始比特的数据库文件)。

没有关联的列不能从一种存储类型转换到另一种存储类型,也不会试图强制它转换它。

2.1柱亲和测定

列的亲和性取决于其声明的类型和按照以下顺序显示的规则:

1。如果声明类型包含一个字符串int,则指定它为整数关联;

2。如果列的声明类型包含任何字符,CLOB或文本字符串,然后列文字亲和力。注:VARCHAR类型包含字符和被指定为文本的亲和力;

三.如果列的声明类型包含一个或没有指定类型,则该列没有关联;

4。如果列的声明类型包含任何真实的,FLOA,或双柱,柱有一个实数的亲和力;

5。否则,它将具有数值亲和力。

注:这是确定的柱亲和的规则的顺序很重要。一个charint声明类型列将比赛规则1和2,但规则1优先于所有列的整数的亲和力。

2.2个关联名称实例

下表显示多少常用的数据类型的名称来自更加传统的SQL实现,而五章则介绍了在前一部分转化为各种类型的亲和力。此表显示只有一小部分,SQLite可以接受的数据类型的名称。注:以下类型名称,括号内的数值参数(如为varchar(255))将被SQLite。SQLite不在字符串的长度施加任何限制,斑点或数字值除大型全球sqlite_max_length限制。
注意:由于点末的int,浮点数声明类型将给出整数亲和力,而不是实数亲和度。字符串声明类型具有数字亲和力,而不是文本关联。

亲和行为的2.3个实例

以下SQL演示SQLite使用柱亲和实现类型转换时的值插入到表:

创建表t1(
t文本,根据规则2的文本关联
怒江数字,数字亲和力按规则5
i整数,按规则1表示整数亲和力
R真实,根据规则4的真正亲和力
没有斑点-没有规则3的亲和力
);
-以文本、整数、整数、实存、文本存储的值。(值分别存储在文本、整数、整数、实、文本中)
插入T1值('500.0 ','500.0 ','500.0 ','500.0 ','500.0);
选择类型(T)、类型(NU),类型(I)、型(R)、类型(无)从;
文本|整数|整数|房|文本

-以文本、整数、整数、实、实存储的值。
从T1删除
插入到t1值(500, 500, 500,500, 500);
选择类型(T)、类型(NU),类型(I)、型(R)、类型(无)从;
文本|整数|整数|房|房

-以文本、整数、整数、实、整数存储的值。
从T1删除;
插入到t1值(500, 500, 500,500, 500);
选择类型(T)、类型(NU),类型(I)、型(R)、类型(无)从;
文本|整数|整数|房|整数

斑点总是以斑点的形式存储,而不管柱的亲和力。删除;
插入T1值(x '0500,X '0500,X '0500,X '0500,X '0500);
选择类型(T)、类型(NU),类型(I)、型(R)、类型(无)从;
斑点| BLOB | BLOB | BLOB | BLOB

-空值也受亲和力
从T1删除;
插入到t1值(空,空,空,空,空);
选择类型(T)、类型(NU),类型(I)、型(R)、类型(无)从;
空空空空| | | |空
3比较式

同样的标准,如SQL,SQLite 3支持的比较运算符如下:= =

3.1排序规则

比较结果与操作数的存储类型有关,基于以下规则:

空值小于任何其他值(包括另一个null)。
整数或实数小于文本值,即一个值;如果两个整数(或实数)比较,则根据实际值执行。
文本小于一个像素,如果比较两个文本,则结果由适当的顺序决定。
如果两个比较比较结果一致与memcmp()

比较3.2个操作数时的相似性

对比之前的值,SQLite试图转换值的存储类整数之间的真实,和/或文字。它是完全依赖于歌剧的数量相似,尽量不去把在比较之前,操作数的相似规则如下:

只有表达,指的是某一列中的值有相同的相似性,被引用的列。注意,如果x和y z代表的列的名称,然后+ X + y.z可以被视为一个表达式来确定它们的相似性。
表达铸(expr为型)有相同相似的列定义为型。
在其他情况下,表达式没有相似性。

比较前3.3比较

应用相似性(应用亲和力)意味着,如果且仅当涉及到的转换是无损的和可逆的,则操作数将被转换为特定的存储类型:

如果其中一个操作数具有整数、实数或数字相似性,而另一个操作数具有文本或无相似性,则我们需要对其他操作数应用数字相似性。
如果其中一个操作数具有文本相似性,而另一个没有相似性,则将文本相似度应用于其他操作数。
在其他情况下,没有应用相似性,并将两个操作数根据它们的原始样本进行比较。
表达在B和C 为两单二元比较操作B和< = > = C数据类型转换比较的形式在X(选择..)这种形式的比较,数据类型的转换是完全一样的,表达在(x,y,z,…)相当于A = X + Y或或= = =。换句话说,在算子右侧的值(在本例中是X

3.4比较的例子

创建表t1(
文本,文本关联
b数字,数字亲和力
C,没有亲和力
没有亲和力
);

值将分别存储为文本、整数、文本和整数。
插入T1值('500 ','500 ','500 ',500);
选择类型(A),(B)类型,类型,类型(C)(D)从T1;
文本|整数|文本|整数

因为列具有文本关联性,所以
比较的右手边被转换为文本。
-比较发生。
从t1选择< 40、< 60、600 >;
0 | 1 | 1

文本关联应用于右边的操作数,但
它们已经是文本,这是一个非运算;没有转换发生。
选择< < 40,60,< '600'from T1;
0 | 1 | 1

列具有数字亲和性,因此应用数字关联。
-右边的操作数。因为操作数已经是数字了,
应用程序的亲和性是一个无操作;没有转换发生。所有
数值比较。
从t1中选择b<40,b<60,b<600;
0 | 0 | 1

将数值关联应用于右边的操作数,将它们转换为
从文本到整数。然后进行数值比较。
选择B<40,B<60,B<'600'from T1;
0 | 0 | 1

没有发生亲和转换。右边的值都有
始终小于文本值的存储类整数
-在左边。
从T1中选择C<40,C<60,C<600;
0 | 0 | 0

没有发生亲和转换。值比较为文本。
选择C<40,C<60,C<'600'from T1;
0 | 1 | 1

没有发生亲和转换。右边的值都有
与整数比较的存储类整数
左边的值。
从t1中选择d<40,d<60,d<600;
0 | 0 | 1

没有发生亲和转换。左边的整数值是
-总是小于右边的文本值。
选择D<40,d<60,d<'600'from T1;
1 | 1 | 1
如果替换了示例中的比较,例如aa,则所有结果都是相同的。

4算子

所有的数学运算符(+,-,*,/,%,,>,|)部署之前将在数字存储类的两个操作数。即使过程是有害的和不可逆的。空操作数在数学运算,产生一个无效的结果。在运营商数量的操作数不被视为数字,则不会被转换为0或0。

5排序、分组和组合查询

当使用ORDER BY子句的查询结果排序,存储类型的空值值排名第一,其次是实数和整数数据分散在数值的顺序,然后检查在文本序列一致,memcmp(秩序)的最后一滴价值。在存储类型转换之前不会有任何排序。

当使用按组分组子句时,不同类型的值被认为是不同的数据。除了整数和实数值外,如果它们在数值上相等,则它们被认为是相同的数据。对于按组子句结果的任何值都不具有亲和力。

组合查询使用联合、交叉和除执行数据之间的隐式比较。对于算术数据的比较,不适用于隐式比较,如:联合、交集或例外。

6排序序列

当SQLite比较两个字符串,它使用一个排序序列或排序功能(一个物体,两表)来决定该字符串值较高时,两个字符串是否在同一time.sqlite三内置功能:二元,无一例,和RTrim。

二使用memcmp()来比较字符串和忽视文本编码。
例如二进制一样,26城市除了ASCII将小写字母之前的情况比较。注意只有ASCII字符可以在案例与改变。因为桌子的尺寸要求,SQLite不尝试UTF资本转化。
RTrim -二进制一样,除尾部空格字符将被忽略。
应用程序可以通过sqlite3_create_collation整理登记额外功能()接口。

6.1在sql中设置订单

每个表中的每个列都有一个相关的排序函数。如果没有显式定义排序函数,则默认情况下使用二进制作为排序函数。列定义中的校对子句可以为列定义可选的排序函数。

两个比较运算符(=,!=,是,而且不是),确定使用哪种排序函数的规则按以下顺序列出:

如果任意一个操作数中的两个操作数都使用显式定义的后缀排序运算符具有排序函数,则比较函数,如果两个操作数在某些情况下,优先考虑使用左操作数排序函数。
如果两个操作数中的一个操作数是一个栏目,它将使用列排序功能进行比较,但两个操作数的排序函数列出优先使用相应的列的左操作数的条件下,为了实现这句话,1个或更多的单一运营商的+在列名仍然处理由原来的列名称。
在其他情况下,使用二进制排序函数进行比较。
在比较操作,如果后缀整理算子应用于其任何子表达式,可以认为它具有明确的排序功能(以上规则1)。此外,如果比较运算符用于比较的表达无处不在,排序的功能由运营商定义将用于比较字符串,并没有物质在表列中出现的表达。如果有两个或更多的整理算子表达式相比较,无论多么深的表达是嵌入式的,或如何使用括号,明确的排序函数出现在左边将使用。

逻辑上的表达式x在y和z之间,与x和x=z =两个比较操作在它们排序时使用相当于两个比较独立于处理的比较操作。当决定排序时,表达式选择(…)与表达式完全相同。

作为SELECT语句的一部分,BY子句中的排序条件也可以通过使用排序运算符来安排。如果设置了排序,则按指定的排序函数进行排序。否则,如果BY子句所使用的排序表达式是一列,则使用列的顺序来确定顺序。如果排序表达式不是列,且没有校对子句,则使用二进制顺序。

6.2示例序列示例

下面的示例将识别排序序列并确定SQL语句文本比较的结果。

创建表t1(
整数主键,
a,排序序列二进制
b整理二进制文件,排序序列二进制二进制文件。
C整理RTrim,整理顺序RTrim / * * /
D整理排序序列缺缺 / * * /
);
x a
插入T1值(1,ABC,ABC,ABC,ABC);
插入T1值(2,ABC,ABC,ABC,ABC);
插入T1值(3,ABC,ABC,ABC,ABC);
插入T1值(4,ABC,ABC,ABC,ABC);

使用二进制(二进制)排序序列的文本的性能比较。
从T1中选择x,其中a=b按x顺序;
结果123

为A = B / * RTrim文本排序序列使用性能比较。* /
选择X从T1在= B整理RTrim为X;
结果1234

为例a / *文本排序序列使用性能比较。* /
从T1中选择x,d=x的顺序;
结果1234

比较使用二进制(二进制)排序序列的文本的性能。
从T1中选择x,其中a=d按x顺序;
结果14

对文本 / * ABC= C的使用RTrim性能比较(二进制)排序。* /
选择X从T1 where'abc ' = C级X;
结果123

为C = ABCRTrim / *文本排序序列使用性能比较。* /
选择X从T1 c = 'abc'order X;
结果123

用缺 / *分组排序序列(价值of'abc'and'abcABC,
***被分成同一组。
从T1组按D顺序选择计数(*)1;
结果4

利用二进制 / *分组排序序列(价值of'abc'and'abcABC,
***被分成不同的组。
select count(*)从T1组(D | |)为1;
结果112

/ * C柱显示RTrim序列排序使用。*(翻译:排序或C柱分选是怀疑是误写…)
用x,x从T1顺序选择x;
结果4123

*(C | |)测序显示二进制整理顺序使用。* /
选择X从T1为(C | |),X;
结果4231

/ * C柱显示缺序列排序使用。* /
选择X从T1顺序整理缺C,X;
结果2431
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部