1.3.2 数据类型
1.3.2.1 数值类型(整数,小数)
整数型 | 关键字 | 所占字节数 |
---|---|---|
最小的整型 | TinyInt | (1字节) |
较小的整型 | SmallInt | (2字节) |
中等的整型 | MediumInt | (3字节) |
整型 | Int | (4字节) |
较大的整型 | BigInt | (8字节) |
特点
1. int(11)中“11”是指字符的显示宽度,与 int 最大值和最小值范围无关。
2. 在创建 int 类型的数据时,默认的是有符号数。如果需要创建无符号的值,使用 unsigned 来进行定义。
3. 当插入的值 大于最大值 小于最小值时,系统会报下面的错误:“ Out of range value for column ‘a’ at row 1”(第1行“a”列的值超出了范围)
补充:zerofill为补零关键字。
小数型
浮点型 | 关键字 |
---|---|
单精度浮点型(4字节) | float (M,D) |
双精度浮点型(8字节) | double (M,D) |
M(精度):表示总共的位数。
D(标度):是指小数点后的个数。
单精度和双精度浮点型可进行四舍五入。
定点型 | 关键字 |
---|---|
定点型(M+2字节) | decimal (M,D) |
Decimal:M的默认值为10,D的默认值为0.精度更高
1.3.2.2 字符串类型
定长字符型:char(可省略,默认为1),存储的所有字符都是4字节。
变长字符型:varchar(不可省略),存储的字符=字符数+1。
非二进制字符串:text。用于保存评论,文章等。
enum枚举型:enum类型的字段在取值的时候,只能取enum中的一个值。
//创建一个枚举实例
create table tab_en(
name enum('a','b','c','d')
);
//插入数据
insert into tab_en values('a');
insert into tab_en values('b');
insert into tab_en values('c');
insert into tab_en values('d');
//当插入的数据,枚举类型中没有 e 的时候,会报错
insert into tab_en values('e');
从上图的错误提示“ Data truncated for column ‘name’ at row 1:第1行“name”列的数据被截断”。可以知道,如果插入的数据不在枚举数据中,是会报错。
set集合型:SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值的集合。set类型的字段在取值的时候,可以获取多个值(获取的值必须提前定义过)。
//创建一个set集合实例
create table tab_s(
name set('a','b','c','d','e','f')
);
insert into tab_s values('a');
insert into tab_s values('a,b');
insert into tab_s values('a,g'); //会报错,在set集合中没有“g”
1.3.2.3 时间日期类型
1. datetime:用于显示年月日,时分秒。
2. timestamp(时间戳):根据当前时区的不同,显示的时间值是不同的。
特点1:timestamp 显示的时间信息,受时区的影响,一个单位的时区之间相差一个小时。
特点2:timestamp 还受MySQL的版本影响。
DateTime与TimeStamp的使用和比较
//创建一个tab_time的表,t1:datetime t2:timestamp
create table tab_time(
t1 datetime,
t2 timestamp
);
//插入数据,now()表示显示当前时间
insert into tab_time values (now() , now());
//查询当前的时间信息
select * from tab_time;
//显示系统 当前的 时区 信息
show variables like '%time_zone%';
//修改当前的 时区 信息,将时区修改为+8.00
set time_zone = '+8:00';
//查看修改后时区的显示时间,(因为修改了时区的信息,所以新的时区时间和datetime的时间相差1个小时)
select * from tabl_time;
year ,date ,time 的使用
1.3.2.4 二进制类型
blob 是一个二进制的对象,用来存储可变数量的数据。
blob列存储的是二进制字符串(字节字符串),text 列存储的是非二进制字符串(字符字符串)。blob 列是字符集,并且排序和比较基于列值字节的数值;text 列有一个字符集,并且根据字符集对值进行排序和比较。
特点:blob主要存储图片,音频视频等。text主要存储纯文本文件。
1.3.2.5 关于各个数据类型之间的比较
char和varchar比较
- char:存取的速度比较快。char为固定的长度存储,直接将数据放入划分好的存储区域即可。
- varchar:节省空间。varchar在存储的时候,会根据存储字符的长度进行划分存储大小,所以比较费时间,但是可以很好的利用存储的空间。
char,varchar与存储引擎
- 对于MyISAM存储引擎,选择char类型比较好。最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
- 对于Innodb存储引擎,选择varchar类型比较好。最好使用可变长度的数据列,因为 InnoDB 数据表的存储格式不分固定长度和可变长度,因此使用 CHAR 不一定比使用 VARCHAR 更好,但由于 VARCHAR 是按照实际的长度存储,比较节省空间,所以对磁盘 I/O 和数据存储总量比较好。
enum枚举和set集合的对比
- enum:==只能取单值。==enum枚举类型中可以存储多个值,但是在插入数据的时候,只能在这些存储的多个值中取一个。(当没有指定enum为 not null 时,可以插入null)例如:存储人的性别字段时,可以使用enum。
- set:==可以取多值。==set是一个集合,可以存储多个值,在插入数据的时候可以插入多个值(但是这些值必须为集合中的值)。例如:存储一个人的兴趣爱好可以使用set。
特点:虽然enum和set在显示的时候是以字符形式,但是在MySQL的内部他们是以数值形式进行存储的。所以这两种数据类型在获取的时候以字符和数值都可以取值。