菜单

SQLite教程(七):数据类型详解

2018年11月16日 - sqlite

     NULL: 表示该值为NULL值。
     INTEGER: 无符号整型值。
     REAL: 浮点值。
     TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
     BLOB: 存储Blob数据,该类型数据和输入数据完全相同。
 

— Text comparison is performed using the NOCASE collation sequence.

您可能感兴趣的篇章:

对二进制比较符合(=, <, >, <= and
>=),如果每个操作数是一律列的讲话,那么该列的默认比较类型决定于所动的比顺序.
如果少单操作数都是排的言语,那么左边的操作数的于类型决定了所而运用的比顺序.如果两单操作数都不是同列,将利用二进制来比较.

    所有的数学操作符(+, -, *, /, %, <<, >>, &, and
|)在实施前还见面优先用操作数转换为NUMERIC存储类型,即使在更换过程被可能会见招致数据信息的少。此外,如果内部一个操作数为NULL,那么她的结果也为NULL。在数学操作符中,如果内部一个操作数看上去并无像数值类,那么她结果吧0还是0.0。

当用子句ORDER挑选值经常,空值首先让选择出来,
然后是整数和实数按顺序为选出, 然后是文本值按memcmp()顺序为增选出来,
最后是BLOB值按memcmp()顺序为挑选出来.在选之前,
没有存储类型的价都叫转换了.

   
字段的亲缘性是依据拖欠字段在宣称时吃定义之项目来控制的,具体的条条框框可参见以下列表。需要注意的凡以下列表的次第,即如某个平等许段类型同时可两种亲缘性,那么散在前头的条条框框以先期出意向。
    1). 如果类型字符串中带有”INT”,那么该字段的直系类型是INTEGER。
    2).
如果类型字符串中蕴含”CHAR”、”CLOB”或”TEXT”,那么该字段的亲情类型是TEXT,如VARCHAR。
    3). 如果类型字符串中包含”BLOB”,那么该字段的血肉类型是NONE。
    4).
如果类型字符串中寓”REAL”、”FLOA”或”DOUB”,那么该字段的直系类型是REAL。
    5). 其余情况下,字段的血肉类型为NUMERIC。

SELECT (a = d) FROM t1;

仲、类型亲缘性:

graphic(n) 和 char(n) 一样,不了那单位凡个别独字元 double-bytes,
n不克跳127。这个样是为着扶持两单字首长的字体,例如中文字。

  1. 控制字段亲缘性的平整:

varchar(n) 长度不固定且其最深尺寸也 n 的字串,n不克超越 4000。

亲缘类型 描述  
TEXT 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。
NUMERIC 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。
INTEGER 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。
REAL 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。
NONE 不做任何的转换,直接以该数据所属的数据类型进行存储。  

CREATE TABLE t1(

复制代码 代码如下:

严厉亲和性模式.在这种模式下,如果急需价值期间彼此转换数据存储类型的话,数据库引擎将发送错误报告,当前言为用会见再次运行.

    2. 有血有肉示例:

By default, when
当SQLite比较有限只文本值的时节,通过系统设定,不管字符串的编码是什么,用memcmp()来比较.
SQLite第三版本允许用户提供任意的函数来替memcmp(),也就是用户定义的比较顺序.

一如既往、存储种类与数据类型:

整数

    TEXT: “YYYY-MM-DD HH:MM:SS.SSS”
    REAL: 以Julian日期格式存储
    INTEGER: 以Unix时间形式保留数据值,即由1970-01-01
00:00:00到手上时刻所流经之秒数。
 

  1. 运算符

   
和布尔列一样,SQLite也一律没供专门的日期时存储类型,而是因TEXT、REAL和INTEGER类型分别不同之格式表示该类型,如:
 

当于少单表达式的结果时,不产生任何移,直接比较结果.如果一个字符串和一个数字较,
数字连续小于字符串.

   
由于SQLite采用的是动态数据类型,而另外传统的干项目数据库使用的是静态数据类型,即字段可以储存的数据类型是在表声明时即令为确定的,因此其之间在数码存储方或者存在正在那个要命之差别。在SQLite中,存储分类与数据类型也有早晚之区别,如INTEGER存储类别好蕴涵6种植不同尺寸的Integer数据类型,然而这些INTEGER数据而被读入到内存后,SQLite会将那通即占用8独字节无符号整型。因此于SQLite而言,即使以表声明中有目共睹了字段类型,我们还可以在拖欠字段中贮存其它项目的多少。然而要专门说明的是,尽管SQLite为咱提供了这种福利,但是只要考虑到数据库平台的可移植性问题,我们当其实的付出被要应该尽可能的保证数据类型的囤和声明的一致性。除非您生极为充分的理,同时以不再考虑数据库平台的移植问题,在是种情况下真可以使用SQLite提供的这种特色。

SELECT * FROM t1 ORDER BY c COLLATE NOCASE;

    在SQLite3中支持之比表达式有:”=”, “==”, “<“, “<=”, “>”,
“>=”, “!=”, “<>”, “IN”, “NOT IN”, “BETWEEN”, “IS” and “IS
NOT”。
    数据的可比结实要依赖让操作数的囤方,其规则也:
    1). 存储方呢NULL的数值低于其它存储类型的值。
    2).
存储方为INTEGER和REAL的数值低于TEXT或BLOB类型的值,如果与为INTEGER或REAL,则因数值规则进行比较。
    3).
存储方啊TEXT的数值小于BLOB类型的价,如果与为TEXT,则冲文本规则(ASCII值)进行比。
    4).
如果是个别独BLOB类型的数值进行比,其结果也C运行时函数memcmp()的结果。

注:在SQLite中,类型VARCHAR(255)的长短信息255未曾其余实际意义,仅仅是为保证和另数据库的宣示一致性。

);

四、操作符:

当初始于前面,SQLite尝试在拿价值在数字存储级(整数和实数)和文书中互相转换。下面列举了有关如何比较二上前制值的事例。在在重号below中利用的表达式可以象征SQL标量表达式或是文本但切莫是一个列值。

声明类型 亲缘类型 应用规则
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER 1
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT 2
BLOB NONE 3
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL 4
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC 5

表达式”x BETWEEN y and z”和 “x >= y AND x <= z”是同等之. 表达式”x
IN (SELECT y …)” 和发挥式 “x = y”
使用相同的章程来操作,这是为控制所假设运的于顺序.如果X是千篇一律列或者二进制的,则”x
IN (y, z …)” 形式之表达式所采取的比较顺序是X的默认的较类型.

   
SQLite并从未供专门的布尔仓储类型,取而代之的凡储存整型1表示true,0表示false。

整数.值被标识也整数,依据值的大大小小可以依次为贮存吗1,2,3,4,5,6,7,8.

   2. 日期及岁月数额类:

Each value stored in an
SQLite数据库被储存的每个值都生一个性,都属下面所列类中的相同种,(被数据库引擎所控制)

老三、比较表达式:

SQLite把发表式 “a IN (x, y, z)” 和 “a = z OR a = y OR a = z”视为相等.

复制代码 代码如下:

— TEXT, REAL, TEXT

   1. 布尔数据类型:

);

   
为了最大化SQLite和任何数据库引擎之间的数据类型兼容性,SQLite提出了”类型亲缘性(Type
Affinity)”的概念。我们可以这么懂”类型亲缘性
“,在表字段于声称后,SQLite都见面基于拖欠字段声明时的门类为夫择一样栽亲缘类型,当数插入时,该字段的数目将会晤先利用亲缘类型作为该值的囤积方,除非亲缘类型不匹配或无法转换时数据到该亲缘类型,这样SQLite才会考虑任何更合乎该值的型存储该值。SQLite目前的本子支持以下五种亲缘类型:

    t TEXT,

    SQLite将数据值的囤划分也以下几种存储类型:
 

    c COLLATE REVERSE, — default collation type REVERSE

一个所有无类型亲和力的排列不见面事先选项下谁类型.在数被输入前她不见面迫使数据易类型.

  1. 分拣,排序,混合挑选

    b COLLATE BINARY, — default collation type BINARY

而是实际,sqlite3也受如下的数据类型:

ORDER BY clause that is part of a SELECT statement may be assigned a
collation sequence to be used for the sort operation explicitly. In this
case the explicit collation sequence is always used. Otherwise, if the
expression sorted by an ORDER BY clause is a column, then the default
collation type of the column is used to determine sort order. If the
expression is not a column, then the BINARY collation sequence is used.

BLOB 【功能最好强劲、如何输入就如何存储,不转任何格式】

— Comparisons are numeric. No conversions are required.

CREATE TABLE t1(

char(n)   n 长度的字串,n不克超过 254。

空.这个价也空值

    c BLOB

一个文本值小于BLOB值。当半单文本值相较的上,则用C语言类库中的memcmp()函数来比。然而,有时候也未是这般的,比如在下面所讲述的“用户定义之整顺序”情况下。

当一个列值被比较为表达式结果的当儿,在比较起前,列的亲和性将被用在发挥结果丁。

拥有的数学运算符(所有的运算符而不是不无关系作用标记符”||”)运算对象首先有数字亲和性,
如果一个恐两只都非克被转换为数字那么操作的结果以是空值。

SELECT b < 60, b < 600 FROM t1;

float   32位第一的实数。

假设表格使用If “CREATE TABLE AS
SELECT…”语句生成的,那么富有的列则都没实际的数据类型,则从未类型亲和性.

无亲和性模式.在这种模式下,值的数量存储类型不闹转换.具有不同存储类型的值期间未可知比,但整数和实数之间可以比较.

SELECT count(*) GROUP BY (d || ”) FROM t1;

0|1

设一个列的数据类型包括字符串”BLOB”或者一旦数据类型被具体化了,那么这列有无类型亲和性.

interger 32 位状元之平头。

仓储的种类最初于分门别类为如下:

SELECT c < 60, c < 600 FROM t1;

上述资料翻译自 
http://libdbi-drivers.sourceforge.net/docs/dbd\_sqlite3/x123.html

INTEGER

源文档 <http://www.21andy.com/blog/20091211/1489.html>

下的例子介绍了The examples below identify the collation sequences that
would be used to determine the results of text comparisons that may be
performed by various SQL statements. Note that a text comparison may not
be required, and no collation sequence used, in the case of numeric,
blob or NULL values.

7.1 分配比较顺序

SQLite是无类型的.
这象征你得保留任何项目的数额到公所想如果保存之任何表的另外列被,
无论这排声明的数据类型是呀(只有自动递增Integer Primary Key才生因此).
对于SQLite来说对字段不指定项目是全然可行的.

INSERT INTO t1 VALUES(‘500’, ‘500’, ‘500’);

— Storage classes for the following row:

抒式 “a IN (SELECT b ….)”
在较时按上面所涉及的老三漫长规则,是二进制比较.(例如, 在一个形似之样式 “a
= b”). 例如,如果’b’是一个列值, ‘a’
是一个表达式,那么,在始发于前面,’b’的亲和性就给更换为’a’的亲和性了.

而外系统预设的BINARY比较顺序,它是因此memcmp()函数比较,SQLite还噙了片只附加的置比较顺序函数,
NOCASE和REVERSE:

 

— Storage classes for the following row:

);

文本

INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);

SELECT * FROM t1 ORDER BY c;

 

要不就持有数字类型亲和性.

2.2 列的亲和性的事例

— Storage classes for the following row:

— TEXT, REAL, INTEGER, TEXT

— (storage class TEXT).

一个备空存储类型的值为当小于任何价值(包括另外一个独具空存储类型的价)。

仲版将具有列的价值都存储成ASCII文本格式。第三版本虽足以将数据存储成整数和实数,还好存储BLOB数据.

 

对于连日来图操作符,所有操作符将率先有文本亲和性。如果内部任何一个操作符不可知被更换为文本(因为它是空值或是BLOB)连接图操作符将凡空值。

关于 INTEGER PRIMARY KEY的讨论,请参考http://zhiwei.li/text/
上有关SQLite的有些资料

— Sorting is performed using the REVERSE collation sequence.

只要列着的数据类型包括以下任何的字符串 “CHAR”, “CLOB”, or “TEXT”
那么是列则具有文本亲和性.要留心VARCHAR类型包括字符串”CHAR”因此为享有文本类型亲和性.

 

一个存有数字型亲和性的排也许下有的五单存储类型存储值.当文本数据让插入一个数字列时,在仓储之前,数据库将尝试着将公文转换成为整数或实数.如果能成转移的话,值将遵循证书活实数的品类为存储.
如果未可知
成功转移的话,值则只能依照文件类存储了,而未会见于转换成无类型或BLOB类型来存储.

When grouping values with the 当用GROUP
BY子句被值分组时,具有不同存储类型的价值为看是不同之, 但也出两样,
比如,一个整数值和一个实数值从数字角度来说是当的,那么其则是等的.用GROUP
by 子句比较了晚,值未有其他亲和性.

类型 描述
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, BYTEA 不限制长度的字符串类型. 二进制数据必须安全地编码存储, 见text类型.
CHAR(), VARCHAR(), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT 不限制长度的字符串类型. 不会被截断或者填充
ENUM 不限制长度的字符串类型. 不像 MySQL, 使用 ENUM代替 VARCHAR不会节省存储空间.
SET 不限制长度的字符串类型. In contrast to MySQL, the input is not checked against the list of allowed values.
YEAR 不限制长度的字符串类型. MySQL 用1个字节 存储 2 个或者 4 个数字年份, 而SQLite 存为一个字符串.
TINYINT, INT1, CHAR A 1 byte type used to store one character, a signed integer between -128 and 127, or an unsigned integer between 0 and 255.
SMALLINT, INT2 2 byte (short) integer type used to store a signed integer between -32768 and 32767 or an unsigned integer between 0 and 65535.
MEDIUMINT 3 byte integer type used to store a signed integer between -8388608 and 8388607 or an unsigned integer between 0 and 16777215.
INT, INTEGER, INT4 4字节 (long)整数类型,用来存储一个有符号的整数,范围从-2147483648 到 2147483647, 或者一个有符号的整数,范围从 0到
4294967295.
BIGINT, INT8, INTEGER PRIMARY KEY 8 字节 (long long) 整型,用来存储有符号的整数,从
-9223372036854775808 到 9223372036854775807 , 或者无符号的整数,从0到 18446744073709551615.  请看下面关于
INTEGER PRIMARY KEY的讨论(哈哈,rowid就是8个字节的整数)
DECIMAL, NUMERIC A string type of unlimited length used to store floating-point numbers of arbitrary precision.
TIMESTAMP, DATETIME 用来存储日期/时间的不限制长度的字符串类型.
要求的格式是 ‘YYYY-MM-DD HH:MM:SS’,其他的东西被忽略.
DATE 用来存储日期的不限制长度的字符串类型. 要求的格式是
‘YYYY-MM-DD’, 别的格式的东西会被忽略.
TIME 用来存储时间的不限制长度的字符串类型. 要求的格式是 ‘HH:MM:SS’,其他格式的东西会被忽略.
FLOAT, FLOAT4, REAL A
4 byte floating-point number. The range is -3.402823466E+38 to
-1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38. Please
note that MySQL treats REAL as an 8 byte instead of a 4 byte float like
PostgreSQL.
DOUBLE, DOUBLE PRECISION, FLOAT8 An
8 byte floating-point number. The range is -1.7976931348623157E+308 to
-2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to
1.7976931348623157E+308.

— Both 60 and 600 (storage class NUMERIC) are less than ‘500’

数字的

为最特别限度的长SQLite数据库与其它数据库的兼容性,SQLite支持排的”类型亲和性”.
列的亲和性是为该列所蕴藏的数量建议一个类型.我们设留心是建议一旦不是强迫.在争鸣及来讲,任何列依然是足以储存任何类型的数额的.
只是对准一些列,如果叫建议项目的话,数据库将本所建议之类型存储.这个为事先利用的数据类型则被称呼”亲和类”.

— Sorting is performed using the NOCASE collation sequence.

    nu NUMERIC,

每当SQLite3.0版备受,数据库中之各一样列都于定义也为下亲和类别中的平种:

在SQLite3.0版中,值为定义为什么类型只与价值我有关,和列没有涉嫌,和变量也远非关系.
(这有时被称作
弱类型.)所出其他的我们所祭的数据库引擎都受静态类型系统的界定,其中的所有值的类似是由于该所属列的性能决定的,而跟值无关.

若数据类型包括字符串”INT”那么她于定义成具有整数亲和性.

Values supplied using the 被输入的价值使用sqlite3_bind_*
APIs的叫归类一个囤积等,这等是跟本的近乎为主相平等的.
(比如sqlite3_bind_blob()绑定一个BLOB的价).

— Text comparison is performed using the BINARY collation sequence.

    b NUMERIC,

SELECT (c = ‘abc’) FROM t1;

  1. 排里的亲和性
  1. 外亲和性模式

SELECT (a = b) FROM t1;

NULL

价的分类是SQL分等级操作的结果,决定给极端远之操作表达式.用户定义的意义或会将价值返回任意的类.在编译的当儿来规定表达式的蕴藏类为主是匪容许的.

SELECT count(*) GROUP BY d FROM t1;

SELECT a < 60, a < 40 FROM t1;

一个整数值或实数值小于任何文本值和BLOB值。当一个平头或实数和另一个平头或实数相较的时候,则按照实际数值来比较。

— Text comparison is performed using the REVERSE collation sequence.

— TEXT, REAL, INTEGER, REAL

7.2 比较顺序的事例

    i INTEGER,

    no BLOB

文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

date   包含了年、月份、日期。

实数. 所有值都是变化的数值,被积存吗8字节的IEEE浮动标记序号.

3.1 比较例子

一个列的亲自和类型是由于该列所声明的项目决定的.遵守以下规则:

time   包含了时、分钟、秒。

— ‘abc’ and ‘ABC’ are placed in the same group).

    d COLLATE NOCASE   — default collation type NOCASE

 

3.比表达式

smallint 16 员正之平头。

TEXT

混挑选操作符UNION, INTERSECT and EXCEPT
在值内实行绝对的于,同样的亲和性将为运用叫拥有的价,这些价值将于积存在一个独立的享有混合SELECT的结果组的列中.
被予以的亲和性是该列的亲和性,这个亲和性是出于剩余的多数的混合SELECTS返回的,这些混合SELECTS在特别位置及起列值(而无是另外类型的表达式).
如果一个加的混合SELECT列没有SELECTS的量,
那么当较前面,该列的值将不有其他亲和性.

— 60 and 40 are converted to ’60’ and ’40’ and values are compared as
TEXT.

切切实实的价值比如SQL语句部分的带动双引号或单引号的亲笔被定义为文本,如果文字没带引号并不曾小数点或指数虽然被定义为整数,如果文字没带引号但有小数点或指数虽然让定义为实数,如果值是空则被定义为空值.BLOB数据以标志X’ABCD’来标识.

— Grouping is performed using the BINARY collation sequence.

前面几上一直忙碌在应聘工作、把上学都有点怠慢了,从昨天起就开始上班了、虽然现在仅仅是试用期,但是自己可怜欣喜,因为自己现在尚独自是一个并未毕业的专科生。嘿嘿,不说了,开始勾画上笔记。。。

— Text comparison is performed using the REVERSE collation sequence.

如上之有些所描述的且是数据库引擎在正规亲和性模式下所开展的操作,
SQLite将讲述其它少种亲和性模式,如下:

double   64员第一的实数。

2.1 列的亲和性的主宰

比如SQLite2.0本一样,在3.0本备受,除了INTEGER PRIMARY
KEY,数据库中之其它列都可以储存任何类型的数据.这同样平整为发出差,在脚的”严格相似模式”中将描述.

0|0

7.用户定义之校顺序

timestamp 包含了年、月、日、时、分、秒、千分之一秒。

BINARY -以memcmp()比较字符串数据, 不考虑文本编码.

decimal(p,s) p 精确值和 s
大小的十上前各项整数,精确值p是负任何生几乎独数(digits)大小值,s是凭小数点後来几员数。如果没有特别指定,则网会使为
p=5; s=0 。

当用SQLite比较少单文本值时,比较顺序将按照以下的平整来决定比的结果.文档的老三有以及第五有讲述在何种场合下发生这种比较.

REVERSE -用倒序比较二前行制文本.

【有号大侠说过下面这样的同等句话,我在这Copy一下:

vargraphic(n) 可变换长都该极老尺寸为 n 的双双字首字串,n不能够超越 2000

REAL

SQLITE 中来如下几栽常见的数据类型:

SELECT (‘abc’ = c) FROM t1;

SELECT (d = a) FROM t1;

NOCASE –
和二进制一样,但每当比较前面,26号的万分写字母盘要为折合成相应的小写字母盘.

较的结果决定为受于的星星只价值的存储类型。遵循以下规则:

SELECT * FROM t1 ORDER BY (c || ”);

一个颇具类型亲和性的排本无类型,文本,或BLOB存储所有的数据.如果数字数据给插入一个有文本类亲和性的排列,在囤之前数字将让换成文本.

1|0

— Text comparison is performed using the BINARY collation sequence.

以SQLite中, 表达式”a BETWEEN b AND c”等于表达式 “a >= b AND a <=
c”,在比较表达式时,a可以是有其他亲和性.

— Sorting is performed using the BINARY collation sequence.

— Grouping is performed using the NOCASE collation sequence (i.e.
values

    a TEXT,

INSERT INTO t1 VALUES(‘500.0’, ‘500.0’, ‘500.0’, ‘500.0’);

当半只列值比较的时候,如果一个列有整数或数字亲和性的时节,而另外一排列却没,那么数字亲和性适用于由非数字列提取的别样具有文本存储类型的值.
P>

Sqlite常用数据类型,这词话我就是起问题,因为:

1.囤积类别

 

每个表格中的每个列都有一个预设的比较类型.如果一个较类型不是二进制所要求的,比较的子句将为实际化为列的定义
来定义该列.

CREATE TABLE t1(

当半独BLOB文本被比较的上,结果决定给memcmp()函数。

比如SQLite2.0本子一致,3.0本的一个特征是二进制比较符’=’, ‘<‘, ‘<=’,
‘>=’ and ‘!=’,一个操作’IN’可以测试固定的分子身价,
三再度的可比操作符’BETWEEN’.

SQLite驱动支持的SQL 列类型 及长度【原出处不祥】

一个兼有整数亲和力的排列在更换点跟富有数字亲和力的排是相同的,但为生把区别
,比如没有浮动量的实值(文本值转换的值)被插具有整数亲和力的排时,它以于移成为整数并循整数类型存储.

输入SQLite的备值,不管它是放开
SQL语句被的仿或提前编译好之绑定以SQL语句被之价值,在SQL语句执行前还吃贮存吗一个类.在底下所讲述的情景下,数据库引擎将于实践时检查并将价值在数字存储类(整数和实数)和文书类间转换.

BLOB. 值是BLOB数据,如何输入就如何存储,不更改格式.

    a,                 — default collation type BINARY

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图