这么多字段类型,该怎么定义?
- MySQL 中有很多字段类型,比如整数、文本、浮点数等。
- 如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度。
- 相反,如果数据类型定义不合理,就有可能会导致数据超出取值范围,引发系统报错,甚至可能会出现计算错误的情况,进而影响到整个系统。
整数类型
- 整数类型⼀共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。
- 其实,在评估用哪种整数类型的时候,你需要考虑存储空间和可靠性的平衡问题:
- 一方面,用占用字节数少的整数类型可以节省存储空间;
- 另一方面,要是为了节省存储空间,使用的整数类型取值范围太小,⼀旦遇到超出取值范围的情况,就可能引起系统错误,影响可靠性。
- 首先确保数据不会超过取值范围,在这个前提之下,再去考虑如何节省存储空间。
浮点数类型和定点数类型
- 浮点数和定点数类型的特点是可以处理小数。
- MySQL 支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL。
- FLOAT 表示单精度浮点数;
- DOUBLE 表示双精度浮点数;
- REAL 默认就是 DOUBLE。
- 浮点数类型有个缺陷,就是不精准。因此,在⼀些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。
- MySQL 有没有精准的数据类型呢?当然有,这就是定点数类型:DECIMAL。
- 浮点数类型是把十进制数转换成二进制数存储,DECIMAL 则不同,它是把十进制数的整数部分和小数部分拆开,分别转换成十六进制数,进行存储。这样,所有的数值,就都可以精准表达了,不会存在因为无法表达而损失精度的问题。
- MySQL 用 DECIMAL(M,D)的方式表示高精度小数。其中,M 表示整数部分加小数部分,一共有多少位,M <= 65。D 表示小数部分位数,D < M。
文本类型
- 在实际的项目中,我们还经常遇到⼀种数据,就是字符串数据。
- TEXT 类型是 MySQL 支持的文本类型的一种。此外,MySQL 还支持 CHAR、VARCHAR、ENUM 和 SET 等文本类型。
- CHAR(M)
- 固定长度字符串。
- CHAR(M) 类型必须预先定义字符串长度。
- 如果太短,数据可能会超出范围;
- 如果太长,又浪费存储空间。
- VARCHAR(M)
- 可变长度字符串。
- VARCHAR(M) 也需要预先知道字符串的最大长度,不过只要不超过这个最大长度,具体存储的时候,是按照实际字符串长度存储的。
- TEXT
- 字符串。
- 系统自动按照实际长度存储,不需要预先定义长度。
- ENUM
- 枚举类型,取值必须是预先设定的一组字符串值范围之内的⼀个,必须要知道字符串所有可能的取值。
- SET
- 是一个字符串对象,取值必须是在预先设定的字符串值范围之内的 0 个或多个,也必须知道字符串所有可能的取值。
- CHAR(M)
- 由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M)。
日期与时间类型
- 用得最多的⽇期时间类型,就是 DATETIME。
- 虽然 MySQL 也支持 YEAR(年)、TIME(时间)、DATE(日期),以及 TIMESTAMP 类型,但是我建议你,在实际项目中,尽量用 DATETIME 类型。
- 因为这个数据类型包括了完整的日期和时间信息,使用起来比较方便。
- 在定义数据类型时,如果确定是整数,就用 INT;如果是小数,一定用定点数类型 DECIMAL;如果是字符串,只要不是主键,就用 TEXT;如果是日期与时间,就用 DATETIME。