数据库之数据类型

Posted sr-program

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库之数据类型相关的知识,希望对你有一定的参考价值。

一:数据库基础

【1】存储引擎:不同的数据类型对应不同的处理机制

(1)innodb:默认存储引擎 相比于myisam来说 读取速度较慢

(2)myisam:5.1之前用的版本 对数据的操控安全性不如innodb

(3)memory:临时存储引擎 数据存入内存 断电数据消失

(4)blackhole:黑洞引擎 无论存放什么数据 都会立马消失

# 查看存储引擎
show engines;

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

insert into t1 values(1);
insert into t2 values(2);
insert into t3 values(3);
insert into t4 values(4);

 

图解一:

技术图片

Innodb:支持事务 行锁 外键 在安全性上比myisam更加高

 

图解二:

技术图片

t1:

(1)frm:表结构

(2)ibd:真实存放的数据

t2:

frm:表结构

MYD:真实存放的数据

MYI:索引

PS:因为其有索引 所以查找数据速度比较快

t3/t4:

(1)frm:表结构

 

【1】创建表的完整语法结构

(1)语法 create table 表名(字段名 类型(宽度 约束条件),字段名 类型(宽度 约束条件));

PS:

(1)字段名 和类型必须要写

(2)宽度值和约束条件可写可不写

(3)字段名之间不能重复

(4)字段名最后一个千万不能加上逗号 

例如:

create table userinfo(id int,name char);

 

(2)约束条件

宽度:

(1)作用:限制数据的存储位数

PS:

(1)当数据超出存储位数 会按照从左到右截断数据

(2)如果在严格模式下 超出数据位数会直接报错

例如:

insert into userinfo(name) values(‘SR‘);   # 插入数据
select name from userinfo;  # S

PS:上述插入char宽度默认为1位 所以只能插入一个S

(1)对于整型来说宽度不是用来限制存储的个数 而是用来限制展示出来的个数

(2)如果超过宽度则直接显示出来 如果小于宽度则以0补齐宽度

(3)只要是整型 都不需要指定宽度 因为有默认的宽度(默认宽度为11位 而int最大数据长度为10位) 足够显示对应的数据

 

(2)条件约束:

not null不能为空

create table userinfo(name char(16));

alter table userinfo modify name char not null

insert into userinfo values(null);  # 报错

PS:

(1)字段类型约束的是数据从存储类型

(2)约束条件是在对字段类型之上在进行约束

 

二:字段类型

 (1)整形:TINYINT,SMALLINT, MEDIUMINT ,INT

TINYINT:

符号:默认有符号的

超出范围:会自动将值换成最先值或者最大值

例如:

create table t1(id TINYINT);
insert into t1 values(-129),(128);  # (-128),(127

PS:如果有符号范围为(-128,127)

 

int

符号:默认有符号的

超出范围:会自动将值换成最先值或者最大值

例如:

create table t2(id int);
insert into t2 values(-2222222222222222222),(222222222222222222222);  # (-2147483648,2147483647

PS:SMALLINT, MEDIUMINT 与上述情况一样

 

unsigned :

作用:将上述整形由默认带符号变成无符号

符号:无符号

范围:如果超出范围最小值为0 最大值为255

例如:

create table t4(id TINYINT unsigned);
insert into t4 values(-129),(256);  # (0,255

技术图片

 

 (2)浮点型:

 (1)float(255,30) 总共255位 小数部分占30位
 (2)double(255,30) 总共255位 小数部分占30位
 (3)decimal(65,30) 总共65位 小数部分占30位

例如:

create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);

PS:精准度 float < double < decimal

 

(3)字符类型(char):

char:后面的数字是限制存储的数据长度的

 例如:

create table t5(name char);
insert into t5 values(SR);  # S

PS:上述存放5位数据 但是由于char默认只能存一位 所以最终在数据库中存入S

 

char(宽度):宽度限制存放位数 如果超过则直接报错 如果不够自动用空格填充

varchar(宽度):宽度限制存放位数 如果超过则直接报错 有几个存几个

 

 

 

 

 

 

 

 

 

 

 

 

 

严格模式:

产生背景:

(1)对于上述例子中 虽然位数不够 其会帮我们截断进行存入数据库

(2)但是截断需要消耗数据库的操作 增大数据的压力

(3)而且截断的存入的数据 本身也不是我们所需要的数据

作用:

(1)可以通过设置严格模式 如果不符合我设置的规则 则会报错

# 查看严格模式
show variable like %mode%

# 模糊匹配
like
 % 匹配任意多个字符
 _ 匹配一个字符

set session  临时有效  只在你当前操作的窗口有效
set global   全局有效  终生有效
# 修改模式为严格模式
set global sql_mode = STRICT_TRANS_TABLES;

PS:上述模式修改之后 一定要重新打开窗口

create table t6(name char);
insert into t6 values(SR);   # 报错

 

以上是关于数据库之数据类型的主要内容,如果未能解决你的问题,请参考以下文章

数据库之数据类型约束条件

数据库之数据类型约束条件

数据类型之简单数据类型

数据之POD数据类型

数据库之数据类型

kotlin系列之基本类型