文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
数据库中事务是最重要的概念之一,所以上篇着重谈了谈数据库中事务的使用,并且举了实例如何在实际开发中去使用事务进行数据库操作。而我们也知道,Mysql 中列的数据类型很多,而大多数人可能只是知道这些不同的数据类型怎么去使用,所以本篇文章主要详细谈谈 Mysql 中各种不同的数据类型。
Mysql 数据类型分类
在 Mysql 中常用数据类型一共有四种字符串数据类型、日期 / 时间数据类型、数值数据类型以及二进制数据类型。
- 字符串数据类型:主要包括下列几种数据类型:char,varchar,tinytext,mediumtext,text,longtext,enum,set。
- 日期 / 时间数据类型:主要包含下列几种数据类型:date,time,datetime,timestamp,year。
- 数值数据类型:主要包含下列几种数据类型:tinyint,smallint,mediumint,int,bigint,float,double,decimal。
- 二进制数据类型:主要包含下列几种数据类型:tityblob,blob,mediumblob,longblob。
约束条件
在开始正式讲解数据类型之前,我们需要先了解下如何给字段添加一些基本的约束条件。Mysql 可以给字段添加的常用约束条件有:unsigned,zerofill,not null,default,primary key,auto_increment,unique key,foreign key。
- unsigned:无符号类型,加上此约束值无法取负数,只能作用于数值类型数据列。
- zerofill:当数据显示长度不够时在数据前面补 0 至指定长度,字段会自动添加 unsigned 约束。
- not null:这个很好理解,给字段添加非空约束。
- default:如果插入数据没有指定值,则使用默认值。
- primary key:给字段添加主键约束,一个表只能有一个主键,但是可以和其他字段形成组合主键,一般与 auto_increment 约束一并使用。
- auto_increment:只能作用于数值类型,字段可以自动递增,默认从 1 开始。一般和 primary key 配合使用。
- unique key:设置唯一约束,则字段的值不能出现重复数据,null 除外。
- foreign key:外键约束,保证数据完整性和唯一性,以及多表联表操作。
字符串类型
char 数据类型
定义: 可以定义一个固定长度的字符串,长度范围在 1 -255 个字符之间,长度必须在表创建时指定,否则会默认定义为 char(1),在存储时字符串如果未达到指定的长度则会填充空格到指定长度。
使用途径: 当我们需要涉及一些长度固定的数据列时可以使用 char 数据类型,比如手机号使用 char(11),身份证号使用 char(18),用户性别使用 char(3)。
varchar 数据类型
定义: 可以定义一个可变长度的字符串,理论情况下可存储最多 255 个字节的数据。但是如果创建时指定 varchar(x),则只能存储不超过 x 个字符的数据。
对比 char 类型区别: 实际上我们更经常使用的还是 varchar 数据类型,因为 char 类型不管存储数据的长度多少,都会占用定义的字节数,但是 varchar 只会占用实际字符串长度 + 1 个字节。但是 char 查询效率相比于 varchar 会更高,所以存储固定长度时我们可以优先选择 char 数据类型。
使用途径 :一般长度不固定的数据列就可以使用 varchar 类型,比如姓名,一般中文名字 2 到 5 字,所以我们定义为 varchar(15)。
tinytext 数据类型
定义:tinytext 也属于变长字符串,最多可存储不超过 255 字节的变长文本。
缺点:tinyint 数据类型定义时不允许设置默认值,在检索也不存在大小写转换,而且效率低于 char 以及 varchar。所以一般情况下比较少使用该数据类型。
mediumtext 数据类型
定义:mediumtext 也属于变长字符串,最多可存储不超过 16k 字节的变长文本。
缺点:mediumtext 和 tinytext 同属于 text 系列数据类型,所以缺点都是一致的。
使用途径:mediumtext 一般用于 varchar 存储范围不符合时用来存储长文本操作,一般情况下使用 mediumtext 存储长文本就可以满足操作。
text 数据类型
定义:text 也属于变长字符串,最多可存储不超过 64k 字节的变长文本。
缺点:text 也属于 text 系列数据类型,所以缺点和上述都是一致的。
使用途径:text 一般用于 mediumtext 存储范围不符合时用来存储长文本操作,一般用户文章存储。
longtext 数据类型
定义:longtext 也属于变长字符串,最多可存储不超过 4G 字节的变长文本。
缺点:longtext 也属于 text 系列数据类型,所以缺点和上述都是一致的。
使用途径:longtext 最长长度可存储不超过 4G 的纯文本,但是一般情况下几乎不需要使用这种数据类型。
enum 数据类型
定义:ENUM 是一个字符串对象,可以通过 ENUM 限制字段的取值范围。如果插入数据时字段的取值并非可选值之一,则会空串或者 NULL 代替用户想要插入的值。enum 集合的长度最多不超过 64K。
缺点: 不建议在数据库使用 ENUM 限制取值范围,因为坑其实挺多的,比如 ENUM 通过角标取值,但是角标从 1 开始,因为 0 留给空串了,再或者在 ENUM 中 0 和 ”0″ 是不一样的,如果将 0 当做角标去操作由于 ENUM 角标从 1 开始会报错,如果使用 ”0″ 去操作,最后插入的是空串,因为角标 0 是预留给空串的。所以说在数据库层次不建议使用 ENUM 限制字段取值范围。
使用途径: 比如用户性别我们在建表时可以使用 ENUM 限制取值范围只能为男或女。
set 数据类型
定义: 数据列定义为 set 则可以存储集合,set 集合最多不超过 64k 的长度。
set 与 enum 的区别:enum 定义数据列的取值范围,但是插入值永远只能有一个值。但是 set 可以设置数据列的取值范围,但是插入值时可以插入多个值。
使用途径:如果我们需要保存集合数据的时候可以将字段设置为 set 集合然后设置一个取值范围,然后插入时在取值范围内取多个值形成集合进行插入。。
日期 / 时间数据类型
Mysql 有多种可以用来存储时间或日期的数据类型,比如我们可以使用 date 存储日期,可以使用 year 存储年份,可以使用 time 存储时间。可以使用 datetime 或者 timestamp 来存储日期和时间的组合,接下来我们来看下这几个日期 / 时间数据类型。
date 数据类型
定义: 用来存储日期,存储范围为 ’1000-01-01’ 到 ’9999-12-31’。
使用途径: 可用于存储年月日的数据列,比如存储用户出生日期我们就可以使用 date 数据类型来进行存储。
time 数据类型
定义: 用来存储时间,不仅可以表示当天的时间,而且还可以用来表示两个时间的时间间隔。取值范围为 ’-838:58:59’ 到 ’838:59:59’。
使用途径:可能很多朋友看到这里怀疑自己的眼睛了,time 取值范围 ’-838:58:59’ 到 ’838:59:59’?实际上这个取值范围是可以这么理解的:D HH:MM:SS,也就是你如果要存储时间间隔则会以时间间隔乘上小时作为小时进行存储。因为这个 time 使用比较复杂,所以我们在这里使用 sql 语句看看几种不同格式时间的插入效果:
- 简单的插入一个当前时间效果就是保存时间:
- 只有一个冒号则只保存时分,秒保存为 00:
- 不存在冒号则时分保存为 00,只保存秒:
- 时间前添加一个 - 2 表示事件是在两天前开始进行,所以保存结果小时就是 -2 * 24 + 1 最后保存为 -49:00:00:
- 时间前添加一个 2 表示事件是在两天后开始进行,所以保存结果小时就是 2 * 24 + 1 最后保存为 49:00:00:
- 可以直接使用数字保存,也就是不输入空格与冒号:
year 数据类型
定义: 这个很简单,就是保存一个年份值。
使用途径: 比如我们需要记录图书出版年份,则可以使用 year 数据类型。
datetime 数据类型
定义: 可以使用 datetime 来保存时间与日期组合格式,存储范围为 1000-01-01 00:00:00 到 2039-01-19 11:14:07。一般有两种保存方式 yyyy-mm-dd HH:MM:SS 或者 yyyymmddHHMMSS。
使用途径: 这个很常用,比如订单下单时间或订单付款时间。
timestamp 数据类型
定义:timestamp 实际上功能和 datetime 差不多,但是范围更小,timestamp 存储范围为 1970-01-01 00:00:00 到 9999-12-31 23:59:59。
使用途径: 这个很常用,比如订单下单时间或订单付款时间。
数值数据类型
刚才其实提到了数值数据类型有很多种,不同类型有不同的存储范围,同样所需的存储空间也是不一样的,数值类型都可以都是有符号,即可设置正负值。
tinyint 数据类型
定义: 存储整型数据,大小为 1 字节,如果保存有符号值则取值范围为 -128 到 127,如果保存无符号值大小为取值范围为 0 到 255。
smallint 数据类型
定义: 存储整型数据,大小为 2 字节,如果保存有符号值则取值范围为 -32768 到 32767,如果保存无符号值大小为取值范围为 0 到 65535。
mediumint 数据类型
定义: 存储整型数据,大小为 3 字节,如果保存有符号值则取值范围为 -8388608 到 8388607,如果保存无符号值大小为取值范围为 0 到 16777215。
int 数据类型
定义: 存储整型数据,大小为 4 字节,如果保存有符号值则取值范围为 -2147683648 到 2147683647,如果保存无符号值大小为取值范围为 0 到 4294967295。
bigint 数据类型
定义: 存储整型数据,大小为 8 字节,如果保存有符号值则取值范围为 -2^63 到 2^63-1,如果保存无符号值大小为取值范围为 0 到 2^64-1。
float 数据类型
定义: 存储浮点数据,大小为 4 字节,浮点型不能设置 unsigned,取值范围为 -1.175494351e – 38 到 1.175494351e – 38。
double 数据类型
定义: 存储浮点数据,大小为 8 字节,浮点型不能设置 unsigned,精度相比 float 会更高,取值范围为 -2.2250738585072014e-308 到 2.2250738585072014e-308。
decimal 数据类型
定义: 常用于存储精确的小数,可以设置存储的字节数和保留的小数位数。存储的字节数最大为 65,默认为 10,小数位数最大为 30,默认为 0。
使用途径: 经常可以使用 decimal 保存金额或者积分值,因为金额一般保存都是固定小数位。
二进制数据类型
定义: 二进制数据类型可存储任何数据,既可存储文本数据,也可存储图像或者多媒体等数据。
二进制数据类型其实相对其他数据类型比较少用,因为文件现在一般都是上传 oss 进行 cdn 加速,一共有四种数据类型:tinyblob,blob,mediumblob,longblob,这几个数据类型的区别在于存储范围。
- tinyblob:存储长度最大为 255 字节。
- blob:存储长度最大为 64k。
- mediumblob:存储长度最大为 16M。
- longblob:存储长度最大为 4G。
**
缺点:** 存储文件过大会影响数据库的性能。
欢迎关注公众号:程序猿周先森。文章原创于微信公众号,本平台不定时更新。