mysql decimal 报错( Out of range value for column)

decimal 位数的坑

1、场景还原

数据库版本:

mysql> select version();
±----------+
| version() |
±----------+
| 5.7.32 |
±----------+
1 row in set (0.02 sec)

数据库中 invoiceAmount 字段设置的类型为 decimal(10,4)

然后保存数据时提交数据为 1234567,然后就报错了。Out of range value for column ‘invoice_amount’ at row 1

就很纳闷,明明设置的是 10 位数呀,这也就 7 位,怎么就报错了呢。

2、原因分析

decimal(10, 4)
-- 这个设置表示的是小数位加上整数位总共为 10 位.醉了,也是。所以调整了位数为 20 位,就 OK 了

3、示例演示一下

3.1 创建脚本

mysql> show create table bcus_test_decimal;
+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table             | Create Table                                                                                                                                                                                           |
+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| bcus_test_decimal | CREATE TABLE `bcus_test_decimal` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `invoice_amount` decimal(10,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3.2 测试插入数据

-- 7 位数的时候就异常
mysql> INSERT INTO bcus_test_decimal (invoice_amount) VALUES(1234567);
1264 - Out of range value for column 'invoice_amount' at row 1

-- 6 位数的时候就正常
mysql> INSERT INTO bcus_test_decimal (invoice_amount) VALUES(123456);
Query OK, 1 row affected (0.04 sec)
 
mysql> select * from bcus_test_decimal;
+----+----------------+
| id | invoice_amount |
+----+----------------+
|  1 | 123456.0000    |
+----+----------------+
1 row in set (0.00 sec)

3.3 修改数据库表字段限制

-- 修改为 20 位
mysql> ALTER TABLE `bcrm`.`bcus_test_decimal` 
MODIFY COLUMN `invoice_amount` decimal(20, 4) NOT NULL DEFAULT 0.0000 AFTER `id`;
Query OK, 1 row affected (0.16 sec)
Records: 1  Duplicates: 0  Warnings: 0
 
-- 再次插入成功 
mysql> INSERT INTO bcus_test_decimal (invoice_amount) VALUES(1234567);
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from bcus_test_decimal;
+----+----------------+
| id | invoice_amount |
+----+----------------+
|  1 | 123456.0000    |
|  2 | 1234567.0000   |
+----+----------------+

以前没有在意这个字段的限制,现在遇到了,记录一下.也希望有遇到同类问题的老铁们借鉴一下。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值