
MySQL数据类型主要包含8类,下面重点详解MySQL数据类型的8大常见数据类型。
数值类型
数值类型,包含:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT。
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 | 
| tinyint | 1 字节 | (-128,127) | (0,255) | 小整数值 | 
| smallint | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 | 
| mediumint | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 | 
| int或integer | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 | 
| bigint | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 | 
| float | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 | 
| double | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 | 
| decimal | DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 | 
浮点型
对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。
| MySQL数据类型 | 含义 | 
| float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 | 
| double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 | 
float和double在不指定精度时,默认会按照实际的精度,由实际的硬件和操作系统决定。
定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
定点数只有一种 decimal,定点数在 MySQL 内部中以字符串的形式存在,比浮点数更为准确,适合用来表示精度特别高的数据。
DECIMAL(M,D)与浮点型一样处理规则,M的取值范围为0~65,D的取值范围为0~30,而且必须<=M,超出范围会报错。
DECIMAL如果指定精度时,默认的整数位是10,默认的小数位为0。
日期时间类型
MySQL 中的日期与时间类型,主要包括:YEAR、TIME、DATE、DATETIME、TIMESTAMP,每个版本可能不同。
| 类型 | 大小(字节) | 范围 | 格式 | 用途 | 
| date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 | 
| time | 3 | ‘-838:59:59’/’838:59:59’ | HH:MM:SS | 时间值或持续时间 | 
| year | 1 | 1901/2155 | YYYY | 年份值 | 
| datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 | 
| timestamp | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 | 
字符串
字符串包括: CHAR、VARCHAR、BINARY、VARBINARY、TEXT 等。
CHAR 是定长的,根据定义的字符串长度分配足够的空间,VARCHAR 用于存储可变长字符串,TEXT 存大文本。
| MySQL数据类型 | 含义 | 
| char(n) | 固定长度,最多255个字符 | 
| varchar(n) | 固定长度,最多65535个字符 | 
| tinytext | 可变长度,最多255个字符 | 
| text | 可变长度,最多65535个字符 | 
| mediumtext | 可变长度,最多2的24次方-1个字符 | 
| longtext | 可变长度,最多2的32次方-1个字符 | 
二进制数据
二进制数据包括:xxxBLOB和xxxBINARY。
BLOB是一个二进制大对象,可以容纳可变数量的数据,有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。
枚举
ENUM 我们在 Java 中经常会用到,它表示的是枚举类型。
它的范围需要在创建表时显示指定,对 1 – 255 的枚举需要 1 个字节存储,对于 255 – 65535 的枚举需要 2 个字节存储。
比如:enum(‘男’,‘女’)定义了一个枚举类型数据,其允许的取值为字符串‘男’或‘女’。
一个枚举类型数据最多可以有65535个枚举项。
集合
SET和ENUM类型非常类似,也是一个字符串对象,里面包含0~64个成员。
SET和ENUM最主要的区别在于SET类型一次可以选择多个成员,而ENUM则只能选择一个。
比如:set(‘读书’,‘听音乐’,‘打球’,‘游泳’)定义了一个集合类型数据,其允许的取值为‘读书’,‘听音乐’,‘打球’,‘游泳’中某一个或某几个的组合。
一个集合类型数据最多包含64个元素值,占用空间8个字节。
关于mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。