MySQL学习【第05篇】MySQL数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44558760/article/details/88790935

一、数据类型介绍

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为四类:数值、日期/时间、字符串(字符)和二进制类型。

存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。

1、数据类型的ABC要素

  • Appropriate(适当)
  • Brief(简洁)
  • Complete(完整)

2、数值数据类型的分类及注意事项

分类:

  • 整数:整数
  • 浮点数:小数
  • 定点数:精确值数值
  • BIT:位字段值

注意事项:

  • 数据类型所表示的值的范围
  • 列值所需的空间量
  • 列精度和范围(浮点数和定点数)

1)整型:

tinyint(小整型):一个字节

int(整型):四个字节。注意:int的宽度指的是显示的宽度,与存储无关

bigint(大整形):八个字节

整形类型,其实没有必要指定显示宽度,使用默认的就ok。

1、tinyint[(m)] [unsigned] [zerofill]

小整数,数据类型用于保存一些范围的整数数值范围:
有符号: -128 ~ 127
无符号:0~ 255

PS: MySQL中无布尔值,使用tinyint(1)构造。

2、[unsigned]参数和[zerofill]参数的应用

将有符号的修改为无符号的:
alter table t1 modify unsigned;               #注意,如果里面有值了,得把里面的值清空了再修改
alter table t2 modify id int(10) zerofill;    #如果显示不够,就用zerofill填充

3、int[(m)][unsigned][zerofill]

整数,数据类型用于保存一些范围的整数数值范围:
有符号: -2147483648 ~ 2147483647
无符号:0~ 4294967295


4、bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:-9223372036854775808 ~ 9223372036854775807
无符号: 0~  18446744073709551615

2)小数:

float:在位数比较短的情况下不精准(**** 数值越大,越不准确 ****)

double:在位数比较长的情况下不精准(**** 数值越大,越不准确 ****)

decimal:如果是小数,则推荐使用decimal,因为精准,内部原理是以字符串的形式去存

1、先创建一个数据库:create datdabase test;

2、验证一:int,tinyint,bigint
create table t1(id tinyint);
create table t1(id int);
create table t1(id bigint);  #如果数字比较大的时候就用bigint

1)如果没有指定符号,默认的是有符号的.
2)insert into t1(-129) #就会报错了,因为范围是-128~127
3)将有符号的修改为无符号的:alter table t1 modify unsigned; #注意,如果里面有值了,得把里面的值清空了再修改)
4)alter table t2 modify id int(10) zerofill; #如果显示不够,就用zerofill填充
5)宽度:跟存的没有关系,指的是显示的宽度

3、验证二:float,double
create table t3(salary float(5,2))	#5代表salary总共多宽,2代表小数点后保留2位,那么整数部分有3位
insert into t3 values(3.725454);
insert into t3 values(-3.725454);
insert into t3 values(1111.725454);	#像这个就会报错了
insert into t3 values(111.725454);

1)bit类型了解就好了
2)bit类型:代表二进制的类型

4、验证三:bit
create table t3(x bit);
insert into t3 values(0),(1);
insert into t3 values(0),(2)); #只能存二进制的,这样的话就会报错
select * from t3;

3、字符串数据类型

  • 表示给定字符集中的一个字母数字字符序列;
  • 用于存储文本或二进制数据;
  • 几乎在每种编程语言中都有实现;
  • 支持字符集和整理;

文本:真实的非结构化字符串数据类型

整数:结构化字符串类型

属于以下其中一类:

4、二进制字符串数据类型

1)字节序列

  • 二进制位按八位分组
  • 存储二进制值
  • 编译的计算机程序和应用程序
  • 图像和声音文件

2)字符二进制数据类型的类

  • 二进制:固定长度和可变长度的二进制字符串
  • BLOB:二进制数据的可变长度非结构化集合

3)常用二进制字符串

char:简单粗暴,不够就用空格凑够固定长度存放起来,浪费空间,但是存储速度快 (牺牲空间,提高速度)

varchar(你有几个就存几个):精准,计算出待存放数据的长度,节省空间,存取速度慢 (牺牲速度,提高效率)

create table t7(x char(5),y varchar(5));
insert into t7 values('sff','aaaaa');
 
#查看字符长度
select char_length(x),char_length(y) from t7;

#打回原形
set sql_mode='pad_char_to_full_length';   

#utf-8里面一个汉字代表三个字节,那'你好啊'就代表九个,加上两个空格就是11个字节
insert into t7 values('你好啊','好好好!'); 
 
#查看字节长度
select length(x),length(y) from t7; 

4、时间数据类型

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

有下面几种类型:

datatime:2017-09-06 10:30:22
date:2017-09-06
time:10:30:22
year:2017
timeatamp:和datatime是一样的,就是支持的范围datatime的大

#验证日期类型
create table stu(
id int,
name char(5),
born_data date,
born_year year,
reg_time datetime,
class_time time
);

insert into stu values(1,'ao',now(),now(),now(),now());
insert into stu values(1,'xiao','2017-09-06','2017','2017-09-06 10:39:00','08:30:00');

#了解
insert into stu values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00');
insert into stu values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); #没有-的可以不用加引号
insert into stu values(1,'alex','20170906',2017,'20170906103900','083000'); #也可以把符号去掉连写



============注意啦,注意啦,注意啦===========
1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
2. 插入年份时,尽量使用4位值
3. 插入两位年份时,<=69,以20开头,比如50,  结果2050      
                >=70,以19开头,比如71,结果1971
MariaDB [db1]> create table t12(y year);
MariaDB [db1]> insert into t12 values  
    -> (50),
    -> (71);
MariaDB [db1]> select * from t12;
+------+
| y    |
+------+
| 2050 |
| 1971 |
+------+

在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别:

  • DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
  • DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
  • DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
  • DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

5、枚举与集合

字段的值只能在给定范围中选择,如单选框,多选框

enum 枚举:规定一个范围:这个范围可以有多个,但是为该字段传值时,只能取规定范围内的其中一个;
set 集合:规定一个范围:这个范围可以有多个,但是为该字段传值时,可以取规定范围内的一个或多个;
enum 如果你不传值,默认是第一个值,或者为NUll;

----------枚举和集合-----------
create table stu1(
id int primary key auto_increment,
name char(5),
sex enum('male','female'), #enum 代表枚举类型
hobbies set('eat','play','study','coding') #set 代表集合类型
);
insert into stu1(name,sex,hobbies) values('haiyan','none','dsfdg');

#如果设置了sex是枚举类型,就的从设定的里面选其中的一个存
select * from stu1; 

insert into stu1(name,sex,hobbies) values('haiyan','female','play,study');

#如果设置了hobbies是集合类型,就得从设定的里面选其中一个或者多个值来存
select * from stu1;  

没有按照枚举或集合规定的传值的结果

按照枚举或集合的规定传值的结果

二、列属性介绍

1、列属性的类别

  • 数值:适用于数值数据类型(BIT 除外)
  • 字符串:适用于非二进制字符串数据类型
  • 常规:适用于所有数据类型

 

猜你喜欢

转载自blog.csdn.net/weixin_44558760/article/details/88790935