目录

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):用于控制数据访问权限

SQL语法

SQL命令

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

SQL数据类型

数字类型

整型

浮点型

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

D表示浮点型数据小数点之后的精度,假如超过D位则四舍五入,即1.233四舍五入为1.23,1.237四舍五入为1.24M表示浮点型数据总共的位数,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下运行结果):

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

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

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

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

结果如下

定点型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);

浮点型 VS decimal

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

日期类型

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的内置函数

我们重新写一个

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)表示字符串长度最长为1024char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+3MySQL处理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时转为tinytextM>500时转为textM>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 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:

数据类型 亲和类型

INTINTEGERTINYINTSMALLINTMEDIUMINTBIGINTUNSIGNED BIG INTINT2INT8 INTEGER

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

BLOB未指定类型 BLOB

REALDOUBLEDOUBLE PRECISIONFLOAT REAL

NUMERICDECIMAL(10,5)BOOLEANDATEDATETIME 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'));

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

SQLite 日期 & 时间 | 菜鸟教程

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: