03.sqlite3学习——数据类型

目录

sqlite3学习——数据类型

SQL语句的功能

SQL语法

SQL命令

SQL数据类型

数字类型

整型

浮点型

定点型decimal

浮点型 VS decimal

日期类型

字符串类型

CHAR和VARCHAR

BLOB和TEXT

SQLite 数据类型

SQLite 存储类

SQLite 亲和类型(Affinity)及类型名称

Boolean 数据类型

Date 与 Time 数据类型


sqlite3学习——数据类型

SQL语句的功能

SQL语句的功能包括以下:

  • 数据定义(DDL):用户定义、删除和修改数据模式
  • 数据查询(DQL):用于查询数据
  • 数据操纵(DML):用于增、删、改数据
  • 数据控制(DCL):用于控制数据访问权限

03.sqlite3学习——数据类型_第1张图片

SQL语法

03.sqlite3学习——数据类型_第2张图片

SQL命令

SQL语句中关键字既可以小写也可以大写

03.sqlite3学习——数据类型_第3张图片

SQL数据类型

03.sqlite3学习——数据类型_第4张图片

数字类型

03.sqlite3学习——数据类型_第5张图片

整型

03.sqlite3学习——数据类型_第6张图片

浮点型

03.sqlite3学习——数据类型_第7张图片

float(M,D),double(M、D)

  • D表示浮点型数据小数点之后的精度,假如超过D位则四舍五入,即1.233四舍五入为1.23,1.237四舍五入为1.24
  • M表示浮点型数据总共的位数,D=2则表示总共支持五位,即小数点前只支持三位数
drop table if exists test_float;
create table test_float (
    num float(5, 2)
) engine=innodb charset=utf8;

insert into test_float values(1.233);
insert into test_float values(1.237);
insert into test_float values(10.233);
insert into test_float values(100.233);
insert into test_float values(1000.233);
insert into test_float values(10000.233);
insert into test_float values(100000.233);

select * from test_float;

以上程序在MySQL中运行结果会报错,提示数据溢出(以下为SQLyog下运行结果):

03.sqlite3学习——数据类型_第8张图片

03.sqlite3学习——数据类型_第9张图片

03.sqlite3学习——数据类型_第10张图片

03.sqlite3学习——数据类型_第11张图片

但在SQLite3中运行不会提示错误,但实际已经发生溢出

首先创建一个数据库,类型为.db

执行上述程序,发现报错,这是因为sqlite中不支持engine=innodb charset=utf8;(显式进行引擎选择和编码选择)

03.sqlite3学习——数据类型_第12张图片

删除engine=innodb charset=utf8;后运行

03.sqlite3学习——数据类型_第13张图片

结果如下

03.sqlite3学习——数据类型_第14张图片

定点型decimal

当数据精度很大的时候我们可以使用定点型

decimal在不指定M、D时默认为decimal(10, 0)

drop table if exists test_decimal;
create table test_decimal (
    float_num float(10, 2),
    double_num double(20, 2),
    decimal_num decimal(20, 2)
) ;

insert into test_decimal values(1234567.66, 1234567899000000.66, 1234567899000000.66);
insert into test_decimal values(1234567.66, 12345678990000000.66, 12345678990000000.66);

03.sqlite3学习——数据类型_第15张图片

03.sqlite3学习——数据类型_第16张图片

浮点型 VS decimal

  • float、double类型存在精度丢失问题,即写入数据库的数据未必是插入数据库的数据
  • decimal无论写入数据中的数据是多少,都不会存在精度丢失问题,decimal类型常见于银行系统、互联网金融系统等对小数点后的数字比较敏感的系统中

日期类型

03.sqlite3学习——数据类型_第17张图片

drop table if exists test_time;
create table test_time (
    date_value date,
    time_value time,
    year_value year,
    datetime_value datetime,
    timestamp_value timestamp
);

insert into test_time values(now(), now(), now(), now(), now());

运行发现报错,这是因为now()是MySQL的内置函数

03.sqlite3学习——数据类型_第18张图片

我们重新写一个

drop table if exists test_time;
create table test_time (
    date_value date,
    time_value time,
    year_value year,
    datetime_value datetime
);
insert into test_time values("2023-8-26","2:00","2023","2023-8-26 2:00");

运行成功:

03.sqlite3学习——数据类型_第19张图片

03.sqlite3学习——数据类型_第20张图片

字符串类型

03.sqlite3学习——数据类型_第21张图片

CHAR和VARCHAR

  • char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足
  • varchar为可变长度字符串,在utf8编码的数据库中其长度范围为0~21844,如varchar(1024)表示字符串长度最长为1024
  • char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+3
  • MySQL处理char类型数据时会将结尾的所有空格处理掉而varchar类型数据则不会
DROP TABLE IF EXISTS test_string;
CREATE TABLE test_string (
    char_value CHAR(5),
    varchar_value VARCHAR(5)
);

INSERT INTO test_string VALUES('a', 'a');
INSERT INTO test_string VALUES(' a', ' a');
INSERT INTO test_string VALUES('a ', 'a ');
INSERT INTO test_string VALUES(' a ', ' a ');

SELECT LENGTH(char_value), LENGTH(varchar_value) FROM test_string;

BLOB和TEXT

text和blob两种数据类型,它们的设计初衷是为了存储大数据使用的

MySql单行最大数据量为64K

当varchar(M)的M大于某些数值时,varchar会自动转为text:

  • M>255时转为tinytext
  • M>500时转为text
  • M>20000时转为mediumtext

SQLite 数据类型

一般数据采用固定的静态数据类型, 而 SQLite 采用的是动态数据类型, 会根据存入值自动判断,这样做是为了和标准的SQL语句相兼容。

SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。

可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

SQLite 存储类

每个存储在 SQLite 数据库中的值都具有以下存储类之一:

存储类

描述

NULL

值是一个 NULL 值。

INTEGER

值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。

REAL

值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。

TEXT

值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。

BLOB

值是一个 blob 数据,完全根据它的输入存储。

SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。

SQLite 亲和类型(Affinity)及类型名称

下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:

数据类型

亲和类型

  • INT
  • INTEGER
  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • BIGINT
  • UNSIGNED BIG INT
  • INT2
  • INT8

INTEGER

  • CHARACTER(20)
  • VARCHAR(255)
  • VARYING CHARACTER(255)
  • NCHAR(55)
  • NATIVE CHARACTER(70)
  • NVARCHAR(100)
  • TEXT
  • CLOB

TEXT

  • BLOB
  • 未指定类型

BLOB

  • REAL
  • DOUBLE
  • DOUBLE PRECISION
  • FLOAT

REAL

  • NUMERIC
  • DECIMAL(10,5)
  • BOOLEAN
  • DATE
  • DATETIME

NUMERIC

Boolean 数据类型

SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。

Date 与 Time 数据类型

SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。

存储类

日期格式

TEXT

格式为 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。

REAL

从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。

INTEGER

从 1970-01-01 00:00:00 UTC 算起的秒数。

对于时间的使用在实际开发中比较常见,我们需要好好掌握。

SQLite 支持以下五个日期和时间函数:

序号

函数

实例

1

date(timestring, modifier, modifier, ...)

以 YYYY-MM-DD 格式返回日期。

2

time(timestring, modifier, modifier, ...)

以 HH:MM:SS 格式返回时间。

3

datetime(timestring, modifier, modifier, ...)

以 YYYY-MM-DD HH:MM:SS 格式返回。

4

julianday(timestring, modifier, modifier, ...)

这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。

5

strftime(format, timestring, modifier, modifier, ...)

这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。

上述五个日期和时间函数把时间字符串作为参数。时间字符串后跟零个或多个 modifier 修饰符。strftime() 函数也可以把格式字符串 format 作为其第一个参数。

因此对于上面日期类型中举的例子,我们可以使用sqlite提供的函数

drop table if exists test_time;
create table test_time (
    date_value date,
    time_value time,
    year_value year,
    datetime_value datetime
);
insert into test_time values(date('now'),time('now','localtime'),datetime('now','localtime'),datetime('now','localtime'));

03.sqlite3学习——数据类型_第22张图片

具体使用可查看:SQLite 日期 & 时间

SQLite 日期 & 时间 | 菜鸟教程

你可能感兴趣的:(SQLite,学习,数据库,嵌入式,sqlite3,sql)