数据类型(data_type)是指系统中所允许的数据的类型。MySQL的数据类型通常是针对每个字段所能存储的数据的数据类型,即这一列存储的数据的数据格式,应该符合该列对应字段的数据类型的规则。
数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。
我们在创建数据表时,就需要为每个字段设定数据类型,每个字段的数据类型应该是根据系统的具体使用场景来进行确定的,某个字段的数据类型不符合系统的要求可能会导致系统崩溃。数据类型的使用,在一定程度上能够影响程序的功能和性能,所以在设计表时,数据类型的选定也是一个重要的环节。
一、MySQL的数据类型
MySQL的数据类型可以大概的分为四大类:数值类型、字符串类型、时间日期类型、二进制类型等。
1、数值类型
数值类型又可以分为三个小类:整型、浮点型、定点数。
(1)整型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
数据类型名称 | 长度 | 含义 |
TINYINT | 1个字节 范围:有符号(-128~127),无符号(0~255) | 很小的整数 |
SMALLINT | 2个字节 范围:有符号(-32768~32767),无符号(0~65535) | 小的整数 |
MEDIUMINT | 3个字节 范围:有符号(-8388608~8388607),无符号(0~16777215) | 中等大小的整数 |
INT | 4个字节 范围:有符号(-2147483648~2147483647),无符号(0~4294967295) | 普通大小的整数 |
BIGINT | 8个字节 范围:有符号(-9223372036854775808〜9223372036854775807),无符号(0~18446744073709551615) | 大整数 |
(2)浮点型:FLOAT 、DOUBLE、REAL
数据类型名称 | 长度 | 含义 |
FLOAT(M,D) | 4个字节 范围:-3.4E38~3.4E38(7个有效位) | 单精度实型 |
DOUBLE(M,D) | 8个字节 范围:-1.7E308~1.7E308(15个有效位) | 双精度实型 |
REAL(M,D) | 8个字节 范围:-1.7E308~1.7E308(15个有效位) | 不精确的双精度浮点型,在创建表时,默认转换成double类型 |
(有效位=整数部分位数+小数部分位数)
float、double、real字段存储位数示例:
注意:real字段设定时是real类型,但是真正保存后MySQL自动转换成double类型了!!
由上图可以发现,float类型存储的数据是原数据的近视值,不能准确的存储原数据,尽管上图中的double类型在有效位范围内存储的数据看似准确,但其实在末尾的小数中存储的也是近视值,在某些对小数要求严格的项目中,通常使用定点数来作为小数的数据格式。
(3)定点数:DECIMAL、NUMERIC
在数据库中存放的是精确值
数据类型名称 | 长度 | 含义 |
DECIMAL(M,D) | 共有65个有效位,小数部分最多30个有效位,0<=D<=30,D<=M<=65-D | 定点数 |
NUMERIC(M,D) | 同上 | 同上 |
设定numeric数据类型时,MySQL默认转换成decimal类型。
2、字符串类型
CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET
数据类型名称 | 长度 | 含义 |
CHAR(M) | M 字节,0<=M<=255,范围:0-255字符 | 固定长度非二进制字符串 |
VARCHAR(M) | L+1字节,L<= M,0<=M<=2^16,范围:64k | 变长非二进制字符串 |
TINYTEXT | L+1字节,L<2^8,范围:0-255字节 | 非常小的非二进制字符串 |
TEXT | L+2字节,L<2^16,范围:64k | 小的非二进制字符串 |
MEDIUMTEXT | L+3字节,L<2^24,范围:16M | 中等大小的非二进制字符串 |
LONGTEXT | L+4字节,L<2^32,范围:4G | 大的非二进制字符串 |
ENUM | 1或2个字节,取决于枚举值的数目 (最大值为65535) | 枚举类型,只能有一个枚举字符串值 |
SET | 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员) | 一个字符串对象,可以有零个或多个SET成员 |
字符类型解析:MySQL--char,varchar,text类型
ENUM类型
枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1-255个成员的枚举需要1个字节存储,对于255-65535个成员,需要2个字节来存储。最多允许有65535个成员。ENUM类型忽略大小写,当插入值不在枚举的范围内时,不会报错,会将第一个值插入。
SET类型
也是一个字符串对象,里面可以包好64个成员,根据成员的不同,存储也不同
1-8个成员,占1个字节,9-16个个成员的集合,占2个字节,17-24成员的集合,占3个字节,25-32成员的集合,占4个字节,33-64成员的集合,占8个字节
SET类型可以一个插入多个成员,ENUM类型一次只能插入一个成员。
SET类型可以从允许集合中选择1-多个元素进行组合。所以对于输入的值只要是允许范围内的,都可以正确注入到SET类型中,对于重复的成员,则只取一次。
3、时间日期类型
YEAR、TIME、DATE、DTAETIME、TIMESTAMP
数据类型名称 | 长度 | 含义 |
YEAR | 1 个字节,范围:1901 ~ 2155 | yyyy |
TIME | 3个字节,范围:-838:59:59 ~ 838:59:59 | HH:mm:ss |
DATE | 3个字节,范围:1000-01-01 ~ 9999-12-3 | yyyy-MM-dd |
DATETIME | 8个字节,范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | yyyy-MM-dd HH:mm:ss |
TIMESTAMP | 4个字节,范围:1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | yyyy-MM-dd HH:mm:ss |
time、date、datatime、timestamp类型解析:MySQL--时间类型
4、二进制类型
BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 、 LONGBLOB
数据类型名称 | 长度 | 含义 |
BIT(M) | 位字段类型 | 大约 (M+7)/8 字节 |
BINARY(M) | 固定长度二进制字符串 | M 字节 |
VARBINARY (M) | 可变长度二进制字符串 | M+1 字节 |
TINYBLOB (M) | 非常小的BLOB | L+1 字节,在此,L<2^8 |
BLOB (M) | 小 BLOB | L+2 字节,在此,L<2^16 |
MEDIUMBLOB (M) | 中等大小的BLOB | L+3 字节,在此,L<2^24 |
LONGBLOB (M) | 非常大的BLOB | L+4 字节,在此,L<2^32 |
二进制类型解析:MySQL--二进制类型