数据库的数据类型
存储引擎
针对不同的文件格式会有不同的存储方式和处理机制,针对不同的数据应该有对应不同的处理机制来存储
mysql主要的存储引擎
-
innodb
这个是mysql5.5版本之后默认的存储引擎,存储数据更加的安全
-
myisam
这个是mysql5.5版本之前默认的存储引擎,速度比innodb更快,但是数据不安全
-
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;
# 存数据
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
查看表发现t1 and t2有东西,但是只要mysql重新启动,t3就是空,t4会即刻释放
创建表的完整语法
# 语法
create table 表名(
字段名1 类型(宽度) 约束条件
字段名2 类型(宽度) 约束条件
字段名3 类型(宽度) 约束条件
字段名4 类型(宽度) 约束条件
)
强调
-
在同一张表中字段名字不能重复
-
宽度和约束条件是可选的,约束条件支持多个
字段名1 类型(宽度) 约束条件1 约束条件2;
create table t5(id);
报错 -
最后一行不能有逗号
create table t6( id int, name char )
补充说明
-
宽度:一般情况下指对存储数据的限制
create table t7(name char); 默认宽度是1 insert into t7 values('json'); insert into t7 values(null);null是关键字
针对不同的版本是出现不同的效果
5.6版本默认没有开启严格模式,规定只能存放一个字符,多出的字符自动截取
5.7版本以上是开启了严格模式,规定存放的个数,多出自动报错
-
严格模式: mysql5.7之后的版本是默认开启的严格模式,使用数据库的标准就是:能尽量少的让数据库敢活就尽量少,不给数据库增加额外的压力。
-
约束条件:null not null不能插入rull
create table t8(id int,name char not null)
-
宽度和约束条件的关系:宽度是限制数据的存储,约束条件是在宽度的基础上增加额外的约束
基本数据类型
整型
-
分类:
TINYINT SMALLINT MEDUIMINT INT BIGINT
-
作用:
存一些年龄,等级 id,号码等等
例子:TINYINT 是否有符号,默认的是带符号的,超出限制存最大可接受值
create table t9(id tinyint);
insert into t9 values(-129),(256);
# 约束条件unsigned 无符号
create table t10(id tinyint unsigned);
create table t11(id int);
# int 默认也是带符号的,整型默认情况下的欧式带有符号的
# 针对整型 括号内的宽度有限
create table t12(id int(8));
insert into t12 values(123456789)
"""
特例:只有整型括号里面的数字不是表示限制位数
id int(8)
如果数字没有超出8位 那么默认用空格填充至8位
如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 针对整型字段括号内无需指定宽度,默认的宽度足够显示所有数据
严格模式
# 如何查看严格模式
show variables like "%mode";
模糊匹配/查询
关键字 like
%:匹配任意多个字符
_:匹配任意单个字符
# 修改严格模式
set session 只在当前窗口有效
set global 全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
修改完之后 重新进入服务端即可
浮点型
- char(4) 数据超过4个字符直接报错,不厚的字符空格补全
- varchar(4) 数据超过4个字符直接报错,不够截取
create table t18(name char(4));
create table t19(name varchar(4));
insert into t18 values('a');
insert into t19 values('a');
# 统计char_length字段长度
select char_length(name) from t18;
# char硬盘里存放的是真正的数据,带有空格的,但是在mysql显示会自动将多余的空格剔除
# 再次修改sql_mode 让MySQL不要做自动剔除操作
set global sql_mode='STRICT_TRABLES,PAD_CHAR_TO_FULL_LENGTH'
char和varchar对比:
char 缺点:浪费空间
优点:直接按照固定的字符存取数据
json egon alex wusir tank
存按照五个字符存,取也是五个字符取
varchar 优点:节省空间
缺点:存取比较麻烦
存的时候需要制作报头,取也需要报头,最后才能取到真实的数据,
时间类型
-
分类:data: 年月日2015-2-03
datatime:年月日时分秒
time:时分秒
Year:2020
create table student( id int, name varchar(6), born_year year, birth data, study_time time, reg_time datatime ); insert into student values(1,'zc','1990','1999-11-11','11:11:11','2020-11-11 11:11:11');
枚举与集合
-
分类:枚举(多选一)
集合(多选多)
-
具体用法
create table user( id int, name char(16), gender enum('male','female') ); insert into user values(1,'zc','male') # 枚举后期存数据的时候只能从里面悬着一个存储 create table teacher( id int, name char(6), gender enum('male','female'), hobby set('read','play','running') ) insert into teacher values(1,'zc','male','read'); insert into teacher values(2,'zcc','female','read,running'); insert into teacher values(2,'zcz','male','eat'); # 集合可以写一个或选择多个,但是不能写里面没有的