mysql数字类型有哪些:选型对照表
mysql数字类型有哪些,整体分为整数型、浮点型、定点型三类,整数包含TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点包含FLOAT、DOUBLE,定点型为DECIMAL;整数适合存储无小数的计数、ID、状态,FLOAT、DOUBLE适合对精度要求不高的科学数值,DECIMAL适合金额、账务这类要求精确小数的业务,该分类规则适用于MySQL5.7、MySQL8.0主流社区版本,不适用于部分第三方二次修改的定制分支版本。
mysql整数数字类型
整数类型支持设置无符号属性UNSIGNED,开启后存储范围平移到非负数区间,不会出现负数,TINYINT占用1字节,有符号范围-128到127,无符号0到255,多用于状态标记、分类编号;SMALLINT占用2字节,有符号范围-32768到32767,无符号0到65535,适合小型统计表的数量字段;MEDIUMINT占用3字节,有符号范围-8388608到8388607,无符号0到16777215,使用频次偏低,一般可以用INT替代;INT占用4字节,有符号范围-2147483648到2147483647,无符号0到4294967295,是业务主键、普通计数最常用类型;BIGINT占用8字节,有符号范围-9223372036854775808到9223372036854775807,无符号上限到18446744073709551615,数据量很大、自增ID容易溢出时选用。
不要依赖整数后面的长度参数,比如INT(10),这个数字只控制显示宽度,不限制存储数值大小,很多新手会误以为它代表最多存10位数字,写入超限数字时不会被截断,只会正常存储,仅在搭配ZEROFILL补零展示时生效。
mysql浮点、定点数字类型
| 类型 | 占用字节 | 精度特点 | 推荐场景 |
|---|---|---|---|
| FLOAT | 4 | 单精度,大约6-7位有效数字 | 温度、权重、非精密统计 |
| DOUBLE | 8 | 双精度,大约15-16位有效数字 | 测绘、实验估算值 |
| DECIMAL | 可变 | 精确十进制,自定义精度标度 | 金额、订单、财务核算 |
FLOAT和DOUBLE采用二进制浮点数存储,计算过程中容易产生微小的精度偏差,直接用等于条件做where匹配大概率匹配不到目标数据,对比这类字段建议改用区间判断,DECIMAL以字符串形式拆解存储十进制数字,不会出现二进制换算带来的精度丢失,定义写法为DECIMAL(M,D),M代表总有效位数,D代表小数点后的位数,M最大值为65,D不能大于M。
DECIMAL每9位数字占用4字节存储空间,位数不足按实际分段分配,相比浮点类型,读写开销会更高,大批量高频运算场景下性能差距能够被观测到,你在设计表结构时,优先评估业务精度需求,不需要精确小数就不用强行选用DECIMAL。
布尔在MySQL里没有独立类型。
BOOL、BOOLEAN本质上是TINYINT(1)的别名,写入true会存1,false存0,查询返回1和0,你可以直接用BOOL声明字段,但底层依旧是整数存储,允许存入0、1以外的其他数字,不能自动拦截非法数值,如果需要严格限制只有两个值,需要额外搭配约束或者程序校验。
zerofill会自动开启unsigned属性。
字段设置ZEROFILL之后,自动带上无符号属性,负数无法存入该字段,查询结果会用前置零补齐设置的显示宽度,比如INT(5)ZEROFILL存入12,查询展示00012,ZEROFILL仅影响客户端展示,数据库内部存储的值不变,排序、索引、计算都以原始数值为准,不会受到补零格式影响。
自增主键优先选BIGINT。
