数据库之数据类型
1.数据存储引擎
一个功能的核心部分,回到mysql
核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎
根据不同的需求 也有着不同的引擎分类
不同的引擎测试
创建表时在最后指定引擎名称 engine = xxx
create table t1(id int)engine=innodb
create table t1(id int not null)engine=csv
create table t1(id int)engine=memory
create table t1(id int)engine=blackhole
总结: innodb是默认的引擎 因为 它是永久存储 并且 支持事务,行锁,外键
2.创建表的完整语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件]
);
类型:使用限制字段必须以什么样的数据类型传值
约束条件:约束条件是在类型之外添加一种额外的限制
# 注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选,字段名,表名和类型是必须的
3、最后一个字段后不加逗号
3.基本数据类型之整型
1、作用:id号,各种号码,年龄,等级
2、分类:
tinyint(**) 1个字节
create table t1(x tinyint);
insert into t1 values(128),(-129);
如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255
如果有符号 例如 tinyint 保存-1280 其实存的是-128 是最小值
int (*****) 4个字节
bigint(***) 8个字节
3、测试:默认整型都是有符号的
create table t4(x int(12) unsigned); #在后面加上约束unsigned 变成无符号
修改严格模式:
超过范围也能添加成功是因为 mysql处于非严格模式
查看当前模式 show variables like "sql_mode";
修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES";
严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式!
在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库
长度限制对于整型的意义:
create table t10(id int(1));
insert into t10 value(454555);
发现这个数也存储成功,说明 这里长度指的不是存储容量限制,而是显示的宽度
如果你的数据超过了显示宽度 有几个显示几个
如果不足 则补全到指定长度 得告诉它用什么来补全
create table t13(id int(10) zerofill);
总结:不是容量限制 而是 显示宽度
要限制显示宽度
1.创建表时 给整型加上宽度
2.加上zerofill约束
4.浮点型: 小数型
1 作用:存储身高、体重、薪资
2 分类:
float (*****) 4
double (**) 8
decimal (**) 不确定(手动设置)
给浮点设置宽度限制
float(m,d) double(m,d) decimal(m,d)
m表示 这个浮点数整体的长度
d表示 小数部分的长度
例如: float(5,3) 最大值: 99.999
3.测试:
相同点
1、对于三者来说,都能存放30位小数,
2. float和double的最大长度为255
不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多
5.字符类型:字符串
1、作用:姓名,地址,描述类的信息
2、分类:
char 定长
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
varchar 变长
3、测试:字符的宽度限制单位是字符个数
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个
char和varchar 长度都比较小 最大就是65535
4. 结论:
select char_length(a),char_length(b) from t18;
使用一个 char_length的函数 可以查看字符的长度
设置sql模式来实现查看全部长度(空格不去掉的长度)
set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
设置完成后重启msyql 再次查询长度
注意:
当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除
select *from t19 where name = "yh"
当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
select *from t19 where name like "yh";
% 任意个数的任意字符
_ 1个任意字符
6.日期类型
1.分类
time 时分秒 HH:MM:SS ***
year 年份 ***
date 日期 年月日 ***
datetime 日期加时间 年月日 时分秒 年份最大是9999 *****
timestamp 时间戳 从1970-1-1开始算 年份最大是2037 *****
2.总结:datetime和timestamp
共同点: 时间的存取通过字符串类型
都可以使用now()函数来插入当前时间
datetime 和 时间戳都能够表示日期和时间
不同之处是: 年份最大范围不同
时间戳可以为空 代表当前时间
时间戳在你更新记录时 会自动更新为当前时间
3、测试
create table student(
id int,
born_year year,
birth date,
class_time time,
reg_time datetime);
insert into student values(1,'2000','2000-01-27','08:30:00','2013-11-11 11:11:11');
7. 集合与枚举类型
枚举 **
用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他
enum("man","woman","other")
总结: 枚举中只能是字符串类型
添加的数据只能是已经出现在枚举中的值
你的值只能是其中的一个
你也可以使用枚举值的序号来插入值 从1开始
多选1
集合 **
用于描述一堆数据 比如你的兴趣爱好
set("watch movie","listen music","play game")
1.数据存储引擎
一个功能的核心部分,回到mysql
核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎
根据不同的需求 也有着不同的引擎分类
不同的引擎测试
创建表时在最后指定引擎名称 engine = xxx
create table t1(id int)engine=innodb
create table t1(id int not null)engine=csv
create table t1(id int)engine=memory
create table t1(id int)engine=blackhole
总结: innodb是默认的引擎 因为 它是永久存储 并且 支持事务,行锁,外键
2.创建表的完整语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件]
);
类型:使用限制字段必须以什么样的数据类型传值
约束条件:约束条件是在类型之外添加一种额外的限制
# 注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选,字段名,表名和类型是必须的
3、最后一个字段后不加逗号
3.基本数据类型之整型
1、作用:id号,各种号码,年龄,等级
2、分类:
tinyint(**) 1个字节
create table t1(x tinyint);
insert into t1 values(128),(-129);
如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255
如果有符号 例如 tinyint 保存-1280 其实存的是-128 是最小值
int (*****) 4个字节
bigint(***) 8个字节
3、测试:默认整型都是有符号的
create table t4(x int(12) unsigned); #在后面加上约束unsigned 变成无符号
修改严格模式:
超过范围也能添加成功是因为 mysql处于非严格模式
查看当前模式 show variables like "sql_mode";
修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES";
严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式!
在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库
长度限制对于整型的意义:
create table t10(id int(1));
insert into t10 value(454555);
发现这个数也存储成功,说明 这里长度指的不是存储容量限制,而是显示的宽度
如果你的数据超过了显示宽度 有几个显示几个
如果不足 则补全到指定长度 得告诉它用什么来补全
create table t13(id int(10) zerofill);
总结:不是容量限制 而是 显示宽度
要限制显示宽度
1.创建表时 给整型加上宽度
2.加上zerofill约束
4.浮点型: 小数型
1 作用:存储身高、体重、薪资
2 分类:
float (*****) 4
double (**) 8
decimal (**) 不确定(手动设置)
给浮点设置宽度限制
float(m,d) double(m,d) decimal(m,d)
m表示 这个浮点数整体的长度
d表示 小数部分的长度
例如: float(5,3) 最大值: 99.999
3.测试:
相同点
1、对于三者来说,都能存放30位小数,
2. float和double的最大长度为255
不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多
5.字符类型:字符串
1、作用:姓名,地址,描述类的信息
2、分类:
char 定长
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
varchar 变长
3、测试:字符的宽度限制单位是字符个数
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个
char和varchar 长度都比较小 最大就是65535
4. 结论:
select char_length(a),char_length(b) from t18;
使用一个 char_length的函数 可以查看字符的长度
设置sql模式来实现查看全部长度(空格不去掉的长度)
set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
设置完成后重启msyql 再次查询长度
注意:
当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除
select *from t19 where name = "yh"
当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
select *from t19 where name like "yh";
% 任意个数的任意字符
_ 1个任意字符
6.日期类型
1.分类
time 时分秒 HH:MM:SS ***
year 年份 ***
date 日期 年月日 ***
datetime 日期加时间 年月日 时分秒 年份最大是9999 *****
timestamp 时间戳 从1970-1-1开始算 年份最大是2037 *****
2.总结:datetime和timestamp
共同点: 时间的存取通过字符串类型
都可以使用now()函数来插入当前时间
datetime 和 时间戳都能够表示日期和时间
不同之处是: 年份最大范围不同
时间戳可以为空 代表当前时间
时间戳在你更新记录时 会自动更新为当前时间
3、测试
create table student(
id int,
born_year year,
birth date,
class_time time,
reg_time datetime);
insert into student values(1,'2000','2000-01-27','08:30:00','2013-11-11 11:11:11');
7. 集合与枚举类型
枚举 **
用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他
enum("man","woman","other")
总结: 枚举中只能是字符串类型
添加的数据只能是已经出现在枚举中的值
你的值只能是其中的一个
你也可以使用枚举值的序号来插入值 从1开始
多选1
集合 **
用于描述一堆数据 比如你的兴趣爱好
set("watch movie","listen music","play game")
总结:集合中的数据 只能是字符串
添加的数据只能是已经出现在集合中的值
你的值可以是其中的任意几个
你也可以使用枚举值的序号来插入值 从1开始 但是只能给一个序号
多选多
添加的数据只能是已经出现在集合中的值
你的值可以是其中的任意几个
你也可以使用枚举值的序号来插入值 从1开始 但是只能给一个序号
多选多