MySQL数据类型详解

  最近发现不少同学在实际业务场景中对数据类型的选择有诸多困惑,遂写下该博文,期望能够帮助同学进一步加深对数据类型的理解。MySQL中数据类型主要包括三大类:数值型、字符型和日期型,本章将详细描述不同数据类型的名称、适用场景以及如何选择数据类型。

· 数值型

  数值型数据类型主要用来存储数字,MySQL中可以把数值型数据分为两类:整数型和小数点型。整数型包括:tinyint、smallint、mediumint、int、bigint,小数点型包括:float、double、decimal(M,D),具体请见下表:

MySQL中整数类型
类型名称 具体描述 存储需求
tinyint 非常小的整数 1个字节
smallint 较小的整数 2个字节
mediumint 中等大小的整数 3个字节
int 普通大小的整数 4个字节
bigint 较大的整数 8个字节
MySQL中小数点类型
类型名称 具体描述 存储需求
float 单精度浮点数 4个字节
double 双精度浮点数 8个字节
decimal(M,D) 定点数(M数值总位数,D小数点后位数) M+2个字节

要点:
1.如果业务不需要小数部分,使用整数来保存数据,通常情况下我们会使用int整数类型,否则使用浮点数来保存数据,通常情况下我们会使用float浮点数类型;
2.浮点数float、double与定点数decimal,在长度一定的情况下,使用浮点数能表示更大的数据范围,但如果对数据精确度要求较高时,建议使用定点数来存储;

· 字符型

  字符型数据类型用来存储字符串数据,MySQL支持两种字符型数据存储:文本字符串和二进制字符串,文本字符串包括:char、varchar、text、enum、set,二进制字符串包括:bit、binary、varbinary、tinyblob、blob、mediumblob、longblob,具体请见下表:

MySQL中文本字符串类型
类型名称 具体描述 存储需求
char 固定长度的字符串 M个字节,1<=M<=255
varchar 可变长度的字符串 L+1个字节,L<=M且1<=M<=255
tinytext 非常小的字符串 L+1个字节,L<2^8
text 较小的字符串 L+2个字节,L<2^16
mediumtext 中等大小的字符串 L+3个字节,L<2^24
longtext 较大的字符串 L+3个字节,L<2^32
enum 枚举类型  
set 字符串对象,可以有零或多个值  
MySQL中二进制字符串类型
类型名称 具体描述 存储需求
bit 位字段类型 约M+7个字节
binary 固定长度二进制字符串 M个字节
varbinary 可变长度二进制字符串 M+1个字节
tinyblob 非常小的BLOB L+1个字节,L<2^8
blob 较小的BLOB L+2个字节,L<2^16
mediumblob 中等大小的BLOB L+3个字节,L<2^24
longblob 较大的BLOB L+4个字节,L<2^32

要点:
1.文本字符串和二进制字符串本质区别在于数据存储方式不同,前者多以文本的ASCII码形式存储在计算机中,后者以文本的二进制形式存储在计算机中;
2.char与varchar,char是固定长度、自动删除插入数据的尾部空格,varchar是可变长度、不会删除尾部空格,char的优势在于处理数据更快,varchar的优势在于节省存储空间;

· 日期型

  MySQL中有多种表示日期的数据类型,主要包括:year、time、date、datetime、timestamp,具体请见下表

MySQL中日期和时间类型
类型名称 具体描述 存储需求 日期范围
year YYYY 1个字节 1901~2155
time hh:mm:ss 3个字节 -838:59:59~838:59:59
date YYYY-MM-DD 3个字节 1000-01-01~9999-12-31
datetime YYYY-MM-DD hh:mm:ss 8个字节 1000-01-01 00:00:00~9999-12-31 23:59:59
timestamp YYYY-MM-DD hh:mm:ss 4个字节 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC

要点:
1.日期和时间数据类型的选择主要基于业务需求,如果只需要记录年份,则使用year类型,如果只需要记录时间,则使用time类型;
2.datetime与timestamp,若同时需要记录日期和时间,优先选择日期范围较大的datetime类型,timestamp的特点在于当插入一条记录但没有指定日期列时,MySQL会把timestamp对应字段的数值用当前时间填充;

分类: 数据库技术