03.sqlite3学习——数据类型

目录

sqlite3学习------数据类型

SQL语句的功能

SQL语法

SQL命令

SQL数据类型

数字类型

整型

浮点型

定点型decimal

[浮点型 VS decimal](#浮点型 VS decimal)

日期类型

字符串类型

CHAR和VARCHAR

BLOB和TEXT

[SQLite 数据类型](#SQLite 数据类型)

[SQLite 存储类](#SQLite 存储类)

[SQLite 亲和类型(Affinity)及类型名称](#SQLite 亲和类型(Affinity)及类型名称)

[Boolean 数据类型](#Boolean 数据类型)

[Date 与 Time 数据类型](#Date 与 Time 数据类型)


sqlite3学习------数据类型

SQL语句的功能

SQL语句的功能包括以下:

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

SQL语法

SQL命令

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

SQL数据类型

数字类型

整型

浮点型

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

  • D表示浮点型数据小数点之后的精度,假如超过D位则四舍五入,即1.233四舍五入为1.23,1.237四舍五入为1.24
  • M表示浮点型数据总共的位数,D=2则表示总共支持五位,即小数点前只支持三位数
sql 复制代码
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下运行结果):

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

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

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

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

结果如下

定点型decimal

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

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

sql 复制代码
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);

浮点型 VS decimal

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

日期类型

sql 复制代码
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的内置函数

我们重新写一个

sql 复制代码
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");

运行成功:

字符串类型

CHAR和VARCHAR

  • char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足
  • varchar为可变长度字符串,在utf8编码的数据库中其长度范围为0~21844,如varchar(1024)表示字符串长度最长为1024
  • char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+3
  • MySQL处理char类型数据时会将结尾的所有空格处理掉而varchar类型数据则不会
cpp 复制代码
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提供的函数

sql 复制代码
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'));

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

SQLite 日期 & 时间 | 菜鸟教程

相关推荐
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。3 小时前
Django中的软删除
数据库·django·sqlite
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
阿里嘎多哈基米4 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码4 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang5 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
DKPT5 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa5 小时前
HTML和CSS学习
前端·css·学习·html