------------------------------

安装 Sqlite3 和 数据库查看工具:

sudo apt-get install sqlite3
sudo apt-get install sqlitebrowser ------------------------------ 基础概念:   数据表中,纵向的一整列叫“列”,横向的一整行叫“记录”,“记录”中每一格叫“字段”,字段的内容叫“数据” ------------------------------ SQL 创建数据表: Create Table 表名称 { 列名称 列数据类型, 列名称 列数据类型, ... };   首先要知道,大多数的数据库引擎都使用“静态数据类型”(基本上除了 SQLite 之外的所有 SQL 数据库引擎都使用“静态数据类型”),使用静态类型,数据的类型就由它的“列”决定,与“列”类型不相符的数据是无法写入到该“列”中的。   而 SQLite 采用的是“动态数据类型”(可以理解为 SQLite 是“无类型限制”的),这意味着你可以保存任何类型的“数据”到任何“表”的任何“列”中(整形主键“列”除外),无论这“列”声明的数据类型是什么。对于 SQLite 来说,不指定“数据类型”是完全合法的。如: Create Table 表名称 { 列名称, 列名称, ... };   尽管 SQLite 为我们提供了这种方便,但是考虑到数据库的平台可移植性,我们在实际的开发中还是应该声明“数据类型”,并且保证“存入的数据类型”和“声明的数据类型”是一致的。除非你有极为充分的理由,同时不再考虑数据库平台的移植问题,在此种情况下确实可以使用 SQLite 提供的这一特性。 ------------------------------   虽然 SQLite 对“数据类型”没有强制要求,但 SQLite 定义了 5 种最基本的“存储类型”,它们决定了“数据”在数据库中的存在形式。每个存放在 SQLite 数据库中的值(或者由这个数据库引擎操作的值)都属于下面 5 种“存储类型”中的一种: 1 NULL 无值(什么也没有,不等同于“空字符串”或 0)
2 INTEGER 有符号整数(根据值的大小存储在 1、2、3、4、6、8 字节中)
3 REAL 浮点数(8 字节的 IEEE 浮点数字)
4 TEXT 字符串(使用数据库内部的编码方式存储,默认 UTF-8)
5 BLOB 字节流(原样存储)   也就是说 SQLite 本质上只有 5 种类别的数据,在 SQLite 的数据库中,也只能存入这 5 种类别的数据。   INTEGER “存储类型”包含 6 种不同长度的不同整形的“数据类型”,这只在磁盘上造成了差异。当 INTEGER 值被从磁盘中读入到内存中以后,它们均被转换成最一般的数据类型(8 字节有符号整形)。   SQLite 的 TEXT 编码方式可以通过 SQL 语句 PRAGMA encoding 来查询和修改: // 查询当前编码方式,默认 UTF-8
PRAGMA encoding; // 设置当前编码方式,只有以下几种
PRAGMA encoding = "UTF-8";
PRAGMA encoding = "UTF-16";
PRAGMA encoding = "UTF-16le";
PRAGMA encoding = "UTF-16be"; ------------------------------   虽然 SQLite 对“数据类型”没有强制要求,但依然有自己的“数据类型”,SQLite 内定了 5 种最基本的“数据类型”,它们决定了“数据”在写入数据库时的“修正方式”。所有的非内定“数据类型”最终都会被视为相应的内定“数据类型”。下面列出了 5 种内定的数据类型: 1、INTEGER   当“文本类型”的数据被插入到此类字段中时,会被自动转换为 INTEGER 格式(前提是转换操作不会导致数据信息丢失以及完全可逆),之后再插入到目标字段中。如果转换失败,则 SQLite 仍会以 TEXT 方式存储该数据。   对于 NULL 或 BLOB 类型的数据,SQLite 将不做任何转换,直接以 NULL 或 BLOB 的方式存储该数据。   需要额外说明的是,对于浮点格式的“常量文本”,如 '30000.0',如果该值可以转换为 INTEGER 类型,同时又不会丢失数值信息,那么 SQLite 就会将其转换为 INTEGER 格式 3000 进行存储。 2、REAL   规则等同于 INTEGER 数据类型,“文本类型”的数据会被转换为 REAL 格式。 3、NUMERIC   规则等同于 INTEGER 数据类型,“文本类型”的数据会被转换为 INTEGER 或 REAL 格式,优先转换为 INTEGER 格式,如果不能转换为 INTEGER 格式,再尝试转换为 REAL 格式。   在执行 CAST 表达式时与 INTEGER 有差别。 4、TEXT   当“数值类型”的数据被插入到此类字段中时,会被自动转换为 TEXT 格式,之后再插入到目标字段中。 5、BLOB   当“任何类型”的数据被插入到此类字段中时,将不做任何的转换,直接以该数据所属的数据类型进行存储。 ------------------------------   虽然 SQLite 有自己内定的“数据类型”,但依然可以使用非内定的“数据类型”来定义“列”。事实上,SQLite 接受“任意字符串”作为“数据类型”使用,也就是说,你可以使用“ABC”、“HELLO”等作为“数据类型”来定义“列”,如果你觉得这样做有意义的话。   最终,SQLite 会把非内定的“数据类型”归类为某一个内定的“数据类型”,并将其视为内定“数据类型”来使用。归类原则如下: 1、如果“数据类型”字符串中包含“INT”,那么这些“数据类型”被归类为 INTEGER 类型。 2、如果“数据类型”字符串中包含“CHAR”、“CLOB”或“TEXT”,那么这些“数据类型”被归类为 TEXT 类型。 3、如果“数据类型”字符串中包含“BLOB”,那么这些“数据类型”被归类为 BLOB 类型。 4、如果“数据类型”字符串中包含“REAL”、“FLOA”或“DOUB”,那么这些“数据类型”被归类为 REAL 类型。 5、其余的“数据类型”被归类为 NUMERIC 类型。   这 5 条归类原则具有先后优先级,前面的规则优先于后面的规则,比如某“列”的“数据类型”声明为“CharInt”,既有第 2 条规则中的“Char”,又有第 1 条规则中的“Int”,那么根据先后顺序,应该优先遵循第 1 条规则,则“CharInt”会被视为 INTEGER 类型。   在 SQLite 中,类型 CHAR(255) 的长度信息 255 没有任何实际意义,仅仅是为了与其它数据库平台的声明保持一致性,CHAR(255) 最终会以 TEXT 格式存入数据库,没有长度限制。 ---------- 举例说明:   比如声明某“列”的“数据类型”是“CHAR(255)“,根据“类型归类原则”,该“列”被视为 TEXT 类型,如果存入的数据是数值 32,那么在存入之前,SQLite 会把 32 转换为字符串 '32' 再存入相应的字段中。   如果声明的“数据类型”是“SMALLINT”,根据“类型归类原则”,该“列”被视为 INTEGER 类型,如果存入的数据是字符串 '-32.0',那么在存入之前,SQLite 会把 '-32.0' 转换为整数 -32 再存入相应的字段中。但是,如果存入的是 'A32' 或 '-32.5',则无法正确转换,此时 SQLite 会以 TEXT 的形式将 'A32' 或 '-32.5' 存入相应的字段中。   如果声明的“数据类型”是“ABC”,根据“类型归类原则”,该“列”被视为 NUMERIC 类型,如果存入的数据是字符串 '-32.0',那么在存入之前,SQLite 会把 '-32.0' 转换为整数 -32 再存入相应的字段中。如果存入的是 '-32.5',则 SQLite 会把 '-32.5' 转换为浮点数 -32.5 再存入相应的字段中。如果存入的是 'A32',则 SQLite 会以 TEXT 的形式将 'A32' 存入相应的字段中。 ------------------------------ 关于布尔值的存储:   SQLite 没有单独的“布尔存储类型”,它使用 INTEGER 类型来存储布尔值,0 为 false,1 为 true。一般的做法是将布尔值转换为 0 或 1,然后再写入 SQLite 数据库中。   下面的 Golang 代码会自动将 true 和 false 转换为 1 和 0: sql.DB.Exec("insert into data values (?,?)", true,false)   不能直接在 SQL 语句中使用 true 或 false,比如下面的代码将无法执行成功: sql.DB.Exec("insert into data values (true,false)") ------------------------------ 关于日期时间的存储:   SQLite 没有提供专门的“日期时间存储类型”,如果要存储日期时间,必须先将日期时间转换成 SQLite 内定的“数据类型”,然后再写入数据库。   SQLite 内置的日期和时间函数(date、time、datetime、julianday、strftime)能够将“日期时间字符串”转换为 TEXT,REAL 或 INTEGER 形式存放,程序可以任意选择这几个“存储类型”去存储日期和时间:   TEXT 作为 IS08601 字符串("YYYY-MM-DD HH:MM:SS.SSS")
  REAL 从格林威治时间 11 月 24 日,4174 B.C 中午以来的天数
  INTEGER 从 1970-01-01 00:00:00 UTC 以来的秒数 ------------------------------ 关于比较表达式:   在 SQLite3 中支持的“比较表达式”有:=、==、<、<=、>、>=、!=、<>、IN、NOT IN、BETWEEN、IS、IS NOT。   数据的比较结果主要依赖于操作数的存储方式,其规则为: 1、存储方式为 NULL 的数值小于其它存储类型的值。 2、存储方式为 INTEGER 和 REAL 的数值小于 TEXT 或 BLOB 类型的值,如果同为INTEGER 或 REAL,则基于数值规则进行比较。 3、存储方式为 TEXT 的数值小于 BLOB 类型的值,如果同为 TEXT,则基于文本规则(ASCII 值)进行比较。 4、如果是两个 BLOB 类型的数值进行比较,其结果为 C 运行时函数 memcmp() 的结果。   即:NULL < INTEGER、REAL < TEXT < BLOB ------------------------------ 关于数学操作符:   所有的“数学操作符”(+、-、*、/、%、<<、>>、&、、|)在执行数学运算前都会先将“操作数”转换为 NUMERIC 存储类型,即使在转换过程中可能会造成数据信息的丢失。此外,如果其中一个操作数为 NULL,那么它们的运算结果亦为 NULL。在数学操作符中,如果其中一个操作数看上去并不像数值类型,那么它们的运算结果为 0 或 0.0。 ------------------------------ 总结:   在使用 Create Table 表名称 { 列名称 列数据类型, 列名称 列数据类型, ... }; 创建 SQLite 数据表时,“列数据类型”最好选用 INTEGER、REAL、NUMERIC、TEXT、BLOB 其中之一,因为 SQLite 本质上只支持这些“数据类型”。如果要兼容其它数据库平台,那么最好选用其它数据库平台支持的“数据类型”作为“列数据类型”。   在向数据库中写入数据时,要保证“写入的数据类型”与“声明的数据类型”一致,这样创建出来的数据库文件才能兼容其它数据库平台。

数据库 - SQLite3 中的数据类型的更多相关文章

  1. sqlite3中的数据类型

    大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的.刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列. Sqlite使用一个 ...

  2. 对图片进行索引,存入数据库sqlite3中,实现快速搜索打开

    对图片进行索引,存入数据库中,实现快速搜索打开    这个任务分为两步: 第一步:建立索引 import os import shutil import sqlite3 # 扫描函数,需扫描路径目录处 ...

  3. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  4. 数据库中字段类型对应的C#中的数据类型

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] ...

  5. 【网络收集】数据库中字段类型对应C#中的数据类型

    数据库中字段类型对应C#中的数据类型: 数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean cha ...

  6. 数据库中字段类型对应C#中的数据类型

    数据库中字段类型对应C#中的数据类型:数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char ...

  7. 数据库中字段类型对应的C#中的数据类型(转载)

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] ...

  8. 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本

    解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...

  9. PostgreSQL、SQL Server数据库中的数据类型的映射关系

    PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关 ...

随机推荐

  1. POJ1797 Heavy Transpotation

    Background  Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bu ...

  2. count(*) count(1) count(column)区别

    count(*) 和count(1)的效果是一样的.在某些情况下效率不一样.也会统计包含null的记录. count(column)会返回当前字段不为null的记录数.

  3. gitlab启用https的配置

    vim /etc/gitlab/gitlab.rb external_url 'https://101.101.101.63'    #启用https,默认是http (改端口:external_ur ...

  4. mysql 数据备份与恢复

    1.mysql的备份 命令:"mysqldump -u root -p 数据库名 [表名] > 备份文件名" 不写表名默认备份所有整个数据库. 注意:备份的文件中没有创建数据 ...

  5. (3.3)mysql基础深入——mysql启动深入分析

    基础:(2.1)学习笔记之mysql基本操作(启动与关闭) 0.mysql启动的 3种方式 (1)mysql.server (2)mysqld_safe (3)mysqld 1.启动分析 [1.1]概 ...

  6. SpringBoot打成的jar包发布,shell关闭之后一直在服务器运行

    1:可以编写shell脚本, 切换到执行的jar包目录,然后使用nohup  让改命令在服务器一直运行 #!/bin/bash cd /srv/ftp/public nohup java -jar l ...

  7. C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法

    对于无标题栏窗体,也就是FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还 ...

  8. Python 之 os.walk()

    原文地址https://www.cnblogs.com/JetpropelledSnake/p/8982495.html          http://www.runoob.com/python/o ...

  9. GreenPlum安装greenplum-cc-web监控

    一. GreenPlum集群安装环境 由虚拟机搭建的一台master两台segment. 二.安装前准备 1) 所需安装包 GreenPlum监控安装包: greenplum-cc-web-3.0.2 ...

  10. jquery控制css的display属性(显示与隐藏)

    jquery控制div的显示与隐藏,很方便的. 例如: $("#id").show()表示display:block, $("#id").hide()表示dis ...