mysql的数字类型
1、mysql整数类型
整数类型又称数值型数据,数值型数据类型主要用来存储数字。
mysql 提供了多种数值型数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。
mysql 主要提供的整数类型有 tinyint、smallint、mediumint、int、bigint,其属性字段可以添加 auto_increment 自增约束条件。下表中列出了 mysql 中的数值类型。
从上表中可以看到,不同类型的整数存储所需的字节数不相同,占用字节数最小的是 tinyint 类型,占用字节最大的是 bigint 类型,占用的字节越多的类型所能表示的数值范围越大。
根据占用字节数可以求出每一种数据类型的取值范围。例如,tinyint 需要 1 个字节(8bit)来存储,那么 tinyint 无符号数的最大值为 28-1,即 255;tinyint 有符号数的最大值为 27-1,即 127。其他类型的整数的取值范围计算方法相同,如下表所示。
提示:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 mysql 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充。如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,year 字段插入 19999,当使用 select 查询该列值的时候,mysql 显示的将是完整的带有 5 位数字的 19999,而不是 4 位数字的值。
其他整型数据类型也可以在定义表结构时指定所需的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。
2、mysql小数类型
mysql 中使用浮点数和定点数来表示小数。
浮点类型有两种,分别是单精度浮点数(float)和双精度浮点数(double);定点类型只有一种,就是 decimal。
浮点类型和定点类型都可以用(m, d)来表示,其中m称为精度,表示总共的位数;d称为标度,表示小数的位数。
浮点数类型的取值范围为 m(1~255)和 d(1~30,且不能大于 m-2),分别表示显示宽度和小数位数。m 和 d 在 float 和double 中是可选的,float 和 double 类型将被保存为硬件所支持的最大精度。decimal 的默认 d 值为 0、m 值为 10。
下表中列出了 mysql 中的小数类型和存储需求。
decimal 类型不同于 float 和 double。double 实际上是以字符串的形式存放的,decimal 可能的最大取值范围与 double 相同,但是有效的取值范围由 m 和 d 决定。如果改变 m 而固定 d,则取值范围将随 m 的变大而变大。
从上表中可以看到,decimal 的存储空间并不是固定的,而由精度值 m 决定,占用 m 2 个字节。
float 类型的取值范围如下:
-
有符号的取值范围:-3.402823466e 38~-1.175494351e-38。
-
无符号的取值范围:0 和 -1.175494351e-38~-3.402823466e 38。
double 类型的取值范围如下:
-
有符号的取值范围:-1.7976931348623157e 308~-2.2250738585072014e-308。
-
无符号的取值范围:0 和 -2.2250738585072014e-308~-1.7976931348623157e 308。
提示:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
float 和 double 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),decimal 如果不指定精度,默认为(10,0)。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。
最后再强调一下:在 mysql 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 decimal 的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。