MySQL 数据类型

MySQL存储引擎

Innodb : 默认的存储引擎,查询速度相对myisam慢,但是更安全 特点是支持行锁,支持外键

myisam : 老版本的存储引擎

memory : 内存引擎,数据全部存在内存中,断电数据消失

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;

 

 

表操作

基本数据类型与约束条件

创建表的完整语法

# 语法:
create table 表名(
    字段1 类型(宽度) 约束条件,
    字段2 类型(宽度) 约束条件,
    字段3 类型(宽度) 约束条件,
    );
# 注意:
1.同一表中,字段名不能相同
2.字段名和字段类型必须有,宽度和约束条件可以没有
3.最后一个字段后不能加逗号
# 补充:
# 1.宽度是对存储数据的限制
例:
    create table userinfo(name char);  # char默认宽度是1,存储一个字符
    insert into userinfo values('xiaoming');  # 存储 x 或 报错
```
1.没有安全模式的数据版本,能存储数据,但只能存储一个字符x,mysql自动截取一个字符,消耗资源.
2.有安全模式的版本直接报错:Data too long for column 'name' at row 1
```
# 2.初始约束条件 >>> null 与 not null
例:
    create table record(id int,name char not null);
    insert into record values(1,'x');  # 正常存储
    insert into record values(1,null);  # 报错
# 总结:
# 类型:限制字段必须以什么样的数据类型存储
# 约束条件: 是类型之外添加额外的限制

 

严格模式

普通模式下存储数据时若超过了他们的最大宽度,数据也能正常存储,那是因为mysql帮我们自动截取了最大长度,但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只能管理数据即可,所以苏姚设置安全模式(严格模式)

show variables like "%mode%";  # 查看数据可配置中变量名包含mode的配置参数(模糊匹配)
# 修改安全模式
set session  # 只在当前操作界面有效
set global  # 全局有效
​
set global sql_mode = 'STRICT_TRANS_TABLES'
# 修改完之后退出当前客户端重新登录即可

 

 

数据类型

整形

  • 分类 : TINYINT SMALLINT MEDIUMINT INT BIGINT

  • 作用 : 存储 id,年龄,号码等

存储范围

 

 

 

验证整形字段有无正负符号及范围

# unsigned 有符号转无符号
create table t5(id tinyint);
insert into t5 values(128),(-129);  # 安全模式(严格模式)下报错,否则按范围存储为127 / -128
create table t6(id tinyint unsigned);
insert into t6 values(-1),(256);
# 补充:
其他整形也是如此,只是范围不同

 

疑问: 类型后面的宽度能否改变字段存储的大小限制

create table t7(id int(8));  
insert into t7 values(1234567890);  # 超出8位正常存储
insert into t7 values(123):  # 少于8位用空格补充
# unsigned zerofill  显式时,不够8位改为用0补充,如果超8位正常显式
create table t8(id int(8) unsigned zerofill);
insert into t8 values(1234567890);
insert into t8 values(1);

 


# 强调:

对于整型来说,数据类型后的宽度并不是存储限制,而是显式限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显式宽度,默认的显式宽度足够显式完整当初存放的数据

浮点型

  • 分类 : float double decimal

  • 应用场景 : 身高,体重,薪资

字段限制特点 如(5,3) 前一位表示所有的位数,后一位表示小数个数

三者最大整数位和小数位对比:

# 存储限制
float(255,30)
double(255,30)
decimal(65,30)
​
# 精确度验证
create table t9(id float(255,30));
create table t10(id double(255,30));
create table t11(id decimal(65,30));
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);
# 总结:
# 精度:float < double < decimal

 

字符类型

  • 分类

    • char(定长)

    • varchar(变长)

  • 作用: 姓名,地址,描述类信息

create table t12(name char(4));  # 宽度为4字符,超出报错,不够用空格补充
create table t13(name varchar(4));  # 宽度为4字符.超出报错,不够是多少字符存多少个字符
insert into t12 values('x');  # 正常存储,用空格部位,在硬盘中占4个字符位
insert into t13 values('y');  # 正常存储,在硬盘中只占一个字符位
'''
针对char类型,首先肯定的是在硬盘上存的绝对是真是数据,但显式的时候mysql会自动将首末尾的空格去掉
'''
# 如果不想mysql帮你自动去除收尾的空格,需要添加一个模式
set global sql_mode='PAD_CHAR_TO_FULL_LENGTH';
# 退出客户端重新登录
select char_length('x') from t12;
select char_length('y') from t13;
​
# 总结:
char
# 特点:存入的字符宽度若不够,用空格补位,在硬盘中存的是空格加字符
# 缺点:浪费空间
# 优点:存取速度快
'xiao' ' wxx' ' lxx'
carchar
# 特点:存入的字符宽度若不够,是几个字符存几个字符,但会在字符前加一个bytes标记字符,类似报头
# 缺点:存取速度慢
# 优点:节省空间
'1bytes+xiao' '1bytes+wxx' '1bytes+lxx'

 

时间类型

分类

  • date : 年-月-日

  • time : 时:分:秒

  • datetime: 年-月-日 时:分:秒

  • Year : 年

create table t14(
    id int,
    name char(16),
    Year year,
    Date date,
    Time time,
    DateTime datetime
)
insert into t14 values(1,'xiaoming','2019','2019-08-19','08:01:00','2019-08-19 08:01:00');

 

枚举与集合类型

分类

  • 枚举enum 多选一

  • 集合 set 多选多

# 枚举 enum
create table t15(
    id int,
    name char(16),
    gender enum('male','female','others')
)
insert into t15 values(1,'xiaoming','xxx');  # 报错
insert into t16 values(1,'xiaoming','male'); # 正确
# 集合 set
create table t16(
    id int,
    name char(16),
    gender enum('male','female','other'),
    hobby set('read','sleep','playgame','dbj')
);
insert into t16 values(1,'hanmm','female','read,sleep,dbj');

 

约束条件

'''
primary key     (pk)    标识该字段为该表的主键,可以唯一标识记录
foreign key     (fk)    标识该字段为该表的外键
not null                标识该字段不能为空
unique key      (uk)    标识该字段值得唯一性
auto_increment          标识该字段的值自动增长(整数增长,且为主键)
default                 为该字段设置默认值
unsigned                无符号
zerofill                使用0填充
'''

 

not null + default

# not null
create table t17(
    id int,
    name char(16)
);
insert into t17 values(1,null);
# 将name字段约束条件改为 not null
alter table t17 modify name char(16) not null;
insert into t17 values(2,null);  # 报错
insert into t17(name,id) values('xiaoming',2);  # 插入数据时,可以指定字段插入
# default
create table t18(
    id int,
    name char(16) default 'xiaoming'
    gender enum('male','female','other') default 'male'
);
insert into t18(id) values(1);  # 当使用默认值时语法
insert into t18(id,name) values(2,'lilei');

 

unique

# 单例唯一  限制某一个字段的唯一性
create table t19(
    id int unique,
    name char(16)
);
insert into t19 values(1,'lilei'),(1,'xiaoming');
insert into t19 values(1,'lilei'),(2,'xiaoming');
# 联合唯一  在语句最后,用括号形式表示那几个字段组合的结果是唯一的
create table t20(
    id int,
    ip char(16),
    port int,
    unique(ip,port)
);
insert into t20 values(1,'127.0.0.1',8080),(2,'127.0.0.1',8080); # 报错
insert into t20 values(1,'127.0.0.1',8080),(1,'127.0.0.1',8081);


primary key + auto_increment

# primary key
# 单从约束的角度来说 primary key 等价于 not null + nuique
create table t21(id int primary key);
desc t21;
insert into t21 values(1),(null);  # 报错 不能为空
insert into t21 values(1),(1);  # 报错 单列唯一
insert into t21 values(1),(2);

 
# 除了约束条件外,主键还是innodb引擎组织数据的依据,提升查找效率(类似书的目录)
'''
强调:
1.一张表中有且只有一个主键,如果你没有设置主键,那么会从上到下搜索,直到遇到一个非空且唯一的字段自动将其设置为主键
'''
create table t22(
    id int,
    name char(16),
    age int not null unique,
    addr char(16) not null unique
)engine=innodb;
desc t22;
'''
2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏的字段作为主键,隐藏意味着你才查询的时候无法根据这个主键字段加速查询
3.一张表中通常应该有一个id字段,并将id字段作为主键
'''

 




# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t23(
    ip char(16),
    port int,
    primary key(ip,port)
);
desc t23;
​
# auto_increment 自动递增
# 主键id作为数据标号,每次最好能自动增加
create table t24(
    id int primary key auto_increment,
    name varchar(16)
);
insert into t24(name) values('x'),('y'),('z');

 

补充

delete from 表名;
该命令确实可以将表中的所有记录删掉,但不不会将id重置为0,所以该命令根本不是用来清空表的,delete是用来删除表中的某一条记录的
如: delete from 表名 where id > 10;
truncate 表名;
该命令将整张表初始化,id重新从0开始记录

 

 

 

 

posted @ 2019-08-19 21:29  waller  阅读(212)  评论(0编辑  收藏  举报