Appearance
数据库中的数据类型
如果没有数据类型,那么MySQL就不知道需要分配多大的存储空间来存储数据。过大会造成资源的浪费, 体积变大效率变低,过小可能会导致数据溢出不能完整保存数据,所以MySQL提供数据类型的目的就是为了 让我们合理分配存储空间,降低数据库的体积,完整的保存数据,更好的对数据库进行优化
MySQL中的数据类型有哪些?
- 整型、浮点型、定点型、字符型、文本型、枚举型、集合类型、日期类型、布尔类型
整型 - 专门用来保存整数的
- tinyint 1字节 (-128,127) (0,255) 小整数值
- smallint 2字节 (-32768, 32767) (0,65535) 大整数值
- mediumint 3字节 (-8388608,8388607) (0,16777215) 大整数值
- int/integer 4字节 (-2147483648,2147483647) (0,4294967295) 大整数值
- bigint 8字节 (-9223372036854775808,9223372036854775807) (0,18446744073709551615)
注意点:
- MySQL中的整型和其他编程语言的整型一样,也区分有符号和无符号
- 默认情况下整型是有符号的
- 在数据类型的后面加上
unsigned则变成无符号类型
sqlcreate table person( id int, age tinyint unsigned ); - 在设计数据库的时候一定要合理的使用数据类型
- 例如:年龄一般使用 tinyint 类型,人活不到255岁
- 在保存数据的时候,如果超出了当前的数据类型的范围,那么就会报错
- 在设置整型的时候,还可以设置整型数据将来显示的位宽
- 现在设置将来显示整型的位宽是2,现在存储的数据是1位,那么将来查询出来的数据就会显示
1; - 例如:若想让2显示为02,则需要在创建表的时候设置位宽,不够则进行补零操作
create table person (id int,age tinyint(2) zerofill); - 如果存储的数据没有指定的位宽,那么会自动补空格或0,如果大于等于位宽,不做任何操作。
- 现在设置将来显示整型的位宽是2,现在存储的数据是1位,那么将来查询出来的数据就会显示
浮点型 - 专门用于保存小数的
float (m,d) 4字节 单精度 double (m,d) 8字节 双精度 m为总位数,d为小数位数
float和double 的区别
- 占用存储空间大小不一样
- 默认保存的小数位数不同
- 保存数据的有效精度不同
特点
- 和其他编程语言中一样,浮点型是不准确的
- 所以在企业开发中千万不能使用浮点数来保存用户的准确(珍贵)信息(RMB)
定点型 - 也是用于存储小数的
decimal (m,d) m总位数 d小数位
定点类型的本质:是将数据分为两个部分来存储,每个部分都是整数 所以定点数不能滥用,因为非常消耗资源
字符型 - 专门用来存储字符串的
char(size) 0-255字节 定长字符串 varchar(size) 0-65535字节 变长字符串
- 区别
- 能够保存的数据容量不一样
- char不会回收多余的字符串,要多少给多少
- varchar会回收多余的字符串,用多少给多少
- 例如使用char(2) 存储'a' ,存储的结果是' a';
- 使用varchar(2) 存储'a' ,存储的结果是'a';
- 以上两种方式,如果是超过定义的范围,会报错
注意点:
- 由于是字符类型,所以传递值建议使用单引号
- varchar理论上是存储65535个字符,但是实际会随着当前数据库的字符集改变
- 如果当前表的字符集为utf8 最大长度就是21845 ---- 65535/3 = 21845 一个字符占用三个字节,所以varchar在utf8表中最多存储21845
- 如果当前表的字符集为gbk 最大长度就是32767 ---- 65535/2 = 32767 一个字符占用两个字节
大文本类型
MySQL中每一行存储的数据大小是有限制的,每一行最多只能存储65534个字节
例如:
sql
create table person(
name1 char(3),
name2 varchar(21845) #在utf8中相当于65535个字节
)charset=utf8;
创建的时候就会报错,因为name1和name2的总长度不能超过65534个字节
所以要通过大文本类型来解决这个问题
- tinytext 0-255字节 短文本字符串
- text 0-65535字节 长文本数据
- mediumtext 0-16777215字节 中等长度文本数据
- longtext 0-4294967295字节 极大文本数据
注意点:
大文本类型在表中并不会实际占用所能保存的字节数,而是利用10个字节引用了实际保存数据的地址
枚举类型
和其他编程语言一样,瑞国某个字段的取值只能是固定的一个值,那么可以使用枚举类型 enum(值1,值2,...)
sql
create table person(
id int,
gender enum('男','女','未知')
);
注意点:
- MySQL中的枚举类型其实是通过整型来实现的
- 和其他编程语言不同的是,其他语言的枚举是从0开始,而MySQL的枚举是从1开始的。
select gender+0 from person;
- 和其他编程语言不同的是,其他语言的枚举是从0开始,而MySQL的枚举是从1开始的。
- 由于底层是使用整型来实现的,所以我们也可以通过整数的方式来赋值
insert into values(1,1);后面的1即代表男
集合类型
和编程开发中一样,如果某个字段的取值只能是几个固定值中的几个,那么就可以使用集合类型 set(值1,值2,...)
sql
create table person(
id int,
hobby set('篮球','足球','高尔夫','足浴')
)
insert into person values(1, '篮球,足球');
注意点:
如果不在固定取值范围内会报错
和枚举一样也是通过整型来实现的 MySQL的集合类型是按照2(n)的方式来实现的 ----- 2的n次方 篮球 ---- 2(0) = 1 足球 ---- 2(1) = 2 高尔夫 ---- 2(2) = 4 足浴 ---- 2(3) = 8 主要是为了方便位运算
布尔类型 - 专门用来保存真假的
sql
create table person(
id int,
flag boolean
)
insert into person values (1,'男');#会报错
insert into person values(1,true); #不报错
insert into person values(1,false); #不报错
注意点
- MySQL中的布尔类型也是使用整型来实现的 0表示假 1表示真
- 底层的本质使用C/C++ 来实现的所以非0即真
日期类型 - 专门用于保存日期
date 3字节 YYYY-MM-DD 日期值
time 3字节 HH:MM:SS 时间值或持续时间
datetime 8字节 YYYY-MM-DD HH:MM:SS 混合日期和时间值
sql
create table person(
time1 date,
time2 time,
time3 datetime
);
# 时间需要用单引号括起来,不然会报错
insert into person values('2020-02-02','08:08:08','2020-02-02 08:08:08');