目录
[浮点型 VS decimal](#浮点型 VS decimal)
[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 日期 & 时间