一,数据存储引擎
什么是引擎?一个功能的核心部分
引擎可以被分类 而为什么要分类呢? 需求场景的不同催生了不同的引擎分类
在mysql中,核心功能是存储数据,涉及到存储数据的代码,就称之为存储引擎
根据不同的需求,也有着不同的引擎分类
不同的引擎测试:
创建表时在最后制定引擎名称 engine = xxxx
比如: create table t1(id int)engine=innodb create table t2(id int not null)engine=csv insert into t1 value(1); insert into t2 value(1);
innoDB 是默认引擎,直接存放于硬盘上,并且支持事务,行锁,外键
mysiam,csc 都是把数据存放于硬盘上
blackhole 是黑洞引擎,不存放任何数据
memory 把数据存放于内存里面,需要重启服务端数据才会消失
二,创建表的完整语句
基本结构如下:
create table 表名 (字段名称 数据类型[(长度) 约束条件],字段名称 数据类型[(长度) 约束条件].......)
这里可以添加多个数据
必须存在的值:字段名,数据类型和表名
可选的:长度和约束条件
(数据类型也是一种约束,所以约束指得是除了数据类型意外的其他规范)
如果添加的数据超过了制定的长度,超出部分就直接丢弃了;
注意:
2.1字段名,库名,表名都不能是mysql的关键字.
2.2在同一张表中,字段名是不能相同的
2.3最后一个字段后不加逗号
三,数据类型
为什么要讲数据分类?
1,为了描述事物更加准确
2,描述取来更加方便
3,节省内存空间
3.1整型
分类 tinyint smallint mediumint int bigint
字节数 1 2 3 4 8
作用:是存放整数的数类型,有id 身份证号 手机号等
测试:默认整型都是有符号的,需要一个二进制位来存储符号
给整型加上约束unsigned来表示无符号(如果超出了范围就存最大的数)(0,255)
如果有符号存的范围是(-128,127)
上面特性的出现是因为mysql处于非严格模式
修改严格模式:'查看当前模式 show variables like "sql_mode";
修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES";(如果在严格模式下如果超出范围就会报错)
强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
所以我们在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度,默认的宽度足够显示当初存放的完整的数据
显示时,不够8位用0填充,如果超出8位则正常显示
create table t13(id int(10) zerofill);
3.2浮点型:小数型
分类 float double decimal
字节数 4 8 不确定(手动指定)
float(m,d) double(m,d) decimal(m,d)
长度说明:m:这个浮点型整体的长度 d:小数部分的长度
例如 float(5,3) 最大值:99.999
区别:
相同点:小数部分的最大长度都是30
不同点:float 和double的最大长度为255,而demcimal的整数部分组大长度是65
精度不同:decimal double float 精度逐渐降低
3.3字符串
(1)作用:姓名,地址 等.用于存放一些纯文字的信息
(2)分类
char 定长
varchar 変长
text 大文本
blob 没有编码的文本
binary 与 bignia
(3)测试:字符的宽度限制单位是字符的个数
create table t12(x char(4)) #超出四个字符则报错,不足四个字符则用空格补充
create table t13(y varchar(4)) #超过四个字符则报错,不足四个字符则有几个存几个
insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'可以查看存入的值得长度,char 和varchar的长度
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
select char_length(x) from t12; #4
select char_length(y) from t13; #1注意:当你在执行这样的查询语句时,mysql会自动将参数末尾的空格去掉,当你在模糊搜索时要注意定长符,后面可能有空格,%是任意个数的任意字符 _是任意的一个字符
select *from t19 where name like "yh%";
char和varchar的优缺点(在使用起来并没有很大的区别)
char存取效率高,但是浪费空间 egon alex lxx wxx yx
varchar存取效率低于char,但是节省存储空间 (1bytes+egon)(1bytes+alex)(1bytes+lxx)
3.3时间和日期
分类:
time 时分秒 11:11:11date 日期(年月日) 1999-01-27
year 年 1999
datetime 日期加时间 范围大
timestamp 时间戳 范围小(自动更新时间)
datetime和timestamp都可以表示日期和时间
共同点:时间的存取通过字符串类型都可以通过now()函数来插入当前时间
不同之处:年份最大的范围不同,时间戳可以为空,代表当前时间(时间戳在你更新记录时会自动更新当前时间)
测试
create table student( id int, name char(16), born_year year, birth date, class_time time, reg_time datetime ); insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11');
3.4枚举和集合
枚举enum,多选一个
用于描述一个已知范围的数据(只能是字符串),可以通过枚举的序号来插入值,但是只能选一个
集合 set,多选多
用于描述一堆数据(只能是字符串),值可以任意选多个,但必须都在集合当中,也可以用序号来取值(类似于索引),但用序号只能取一个,
测试:
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('play','read','music','piao')
);