本篇文章小编给大家分享一下MySQL数据类型DECIMAL深入代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
1.DECIMAL类型简介
DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。NUMERIC与DECIMAL同义,如果字段类型定义为NUMERIC,则将自动转成DECIMAL。
对于声明语法DECIMAL(M,D),自变量的值范围如下:
M是最大位数(精度),范围是1到65。可不指定,默认值是10。
D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在salary列中的值的范围是从-999.99到999.99。
2.DECIMAL使用实战
下面我们将创建测试表来验证DECIMAL字段类型的使用:
# 创建具有DECIMAL字段的表 验证decimal默认是decimal(10,0) mysql> create table decimal_tb (col1 decimal,col2 decimal(5,2)); Query OK, 0 rows affected (0.04 sec) mysql> show create table decimal_tbG *************************** 1. row *************************** Table: decimal_tb Create Table: CREATE TABLE `decimal_tb` ( `col1` decimal(10,0) DEFAULT NULL, `col2` decimal(5,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) # 插入数据测试 # 结论:超出存储范围会报错,小数位不足会自动补0,首位数字为0自动忽略,小数位超出会截断 并按四舍五入处理。 mysql> insert into decimal_tb (col1,col2) values (100,100); Query OK, 1 row affected (0.05 sec) mysql> insert into decimal_tb (col2) values (1.23); Query OK, 1 row affected (0.01 sec) mysql> insert into decimal_tb (col2) values (10.2); Query OK, 1 row affected (0.01 sec) mysql> insert into decimal_tb (col2) values (09.9); Query OK, 1 row affected (0.01 sec) mysql> select * from decimal_tb; +------+--------+ | col1 | col2 | +------+--------+ | 100 | 100.00 | | NULL | 1.23 | | NULL | 10.20 | | NULL | 9.90 | +------+--------+ 4 rows in set (0.00 sec) mysql> insert into decimal_tb (col2) values (9999); ERROR 1264 (22003): Out of range value for column 'col2' at row 1 mysql> insert into decimal_tb (col2) values (12.233); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> show warnings; +-------+------+-------------------------------------------+ | Level | Code | Message | +-------+------+-------------------------------------------+ | Note | 1265 | Data truncated for column 'col2' at row 1 | +-------+------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> insert into decimal_tb (col2) values (12.2300); Query OK, 1 row affected (0.01 sec) # 变量范围测试 # 结论:M范围是1到65,D范围是0到30,且D不大于M mysql> alter table decimal_tb add column col3 decimal(6,6); Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table decimal_tb add column col4 decimal(6,7); ERROR 1427 (42000): For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'col4'). mysql> alter table decimal_tb add column col4 decimal(65,2); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table decimal_tb add column col4 decimal(66,2); ERROR 1426 (42000): Too-big precision 66 specified for 'col4'. Maximum is 65. mysql> alter table decimal_tb add column col5 decimal(60,30); Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table decimal_tb add column col6 decimal(60,31); ERROR 1425 (42000): Too big scale 31 specified for column 'col6'. Maximum is 30.
3.DECIMAL使用总结
上面的内容从实战出发,介绍了DECIMAL类型的使用方法及注意事项,你可能也知道float、double这些浮点数类型,这两个同样可以存储小数,但这里不过多介绍,只是提醒大家float、double类型无法确保精度,很容易产生误差,特别是在求和计算的时候,所有当存储小数,特别是涉及金额时推荐使用DECIMAL类型。这里总结下使用DECIMAL应该注意的事项:
DECIMAL(M,D)中,M范围是1到65,D范围是0到30。
M默认为10,D默认为0,D不大于M。
DECIMAL(5,2)可存储范围是从-999.99到999.99,超出存储范围会报错。
存储数值时,小数位不足会自动补0,首位数字为0自动忽略。
小数位超出会截断,产生告警,并按四舍五入处理。
使用DECIMAL字段时,建议M,D参数手动指定,并按需分配。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整