MySQL 数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。大致可以分为四类:数值、日期/时间、字符串(字符)和二进制类型。
数值类型
MySQL支持所有标准SQL数值数据类型。整数类型、浮点数类型和定点数类型
- 整数类型包括
TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
- 浮点数类型包括
FLOAT
和DOUBLE
- 定点数类型为
DECIMAL
。
整数类型
整数类型又称数值型数据,数值型数据类型主要用来存储数字。其属性字段可以添加 AUTO_INCREMENT
自增约束条件。
小数类型(浮点数和定点数型类型)
- 不论是定点类型还是浮点类型,如果插入值的精度超出实际定义的精度范围,系统会自动进行四舍五入处理,使值的精度达到要求
- 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题,所以尽量避免做浮点数比较。
浮点数型类型
- 浮点类型有两种,分别是单精度浮点数(
FLOAT
)和双精度浮点数(DOUBLE
); - 浮点类型和定点类型都可以用**(M, D)来表示,其中M称为精度,表示总共的位数(小数点"."不占位数);D称为标度,表示小数的位数**。
- 如:float(6,2)的含义数据是float型,数据长度是6,小数点后保留2位。所以,1234.56是符合要求的
- 浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。
- FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定)
- 建议在定义浮点数时,如果不是实际情况需要,最好不要使用指定小数精度的方法,如果使用了,可能会影响数据库的迁移
定点数型类型
- 定点类型只有一种,就是
DECIMAL
- DECIMAL 如果不指定精度,默认 D 值为 0、M 值为 10,即(10,0),就是认为是整数,默认情况下也就是表示整数,插入小数的话小数部分会被舍弃掉
- DECIMAL 类型不同于 FLOAT 和 DOUBLE。DECIMAL实际上是以字符串的形式存放的,DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。如果改变 M 而固定 D,则取值范围将随 M 的变大而变大,占用 M+2 个字节。
- 如果要对数据的精度要求比较高,如货币、科学数据等,还是选择定点数DECIMAL类型l比较安全
总览表
类型 | 类型名称 | 大小 | 范围(有符号) | 范围(无符号)unsigned 非负数 | 用途 |
---|---|---|---|---|---|
整数类型 | TINYINT | 1 bytes | (-128,127) | (0,255) | 很小的整数 |
整数类型 | SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 小的整数 |
整数类型 | MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 中等大小的整数 |
整数类型 | INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 普通大小的整数 |
整数类型 | BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
浮点数类型 | FLOAT | 4 bytes | (-3.402823466E+38,-1.175494351E-38) | 0 和 (1.175494351E-38,3.402823466E+38) | 单精度、浮点数值 |
浮点数类型 | DOUBLE | 8 bytes | (-1.7976931348623157E+308,-2.2250738585072014E-308) | 0 和 (2.2250738585072014E-308,1.7976931348623157E+308) | 双精度、浮点数值 |
定点书类型 | DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值,同DOUBLE型 | 依赖于M和D的值,同DOUBLE型 | 小数值 |
显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充。如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,year 字段插入 19999,当使用 SELECT 查询该列值的时候,MySQL 显示的将是完整的带有 5 位数字的 19999,而不是 4 位数字的值。
其他整型数据类型也可以在定义表结构时指定所需的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。