MySQL Out of range value for column bills_amount

本文探讨了在MySQL中从一张表的amount字段向另一张表的bills_amount字段迁移数据时遇到的Outofrangevalue异常。尽管数值未超过bigint类型的上限,但由于目标字段为无符号类型,尝试插入负数导致异常。文章深入解析了有符号与无符号bigint的区别,以及如何避免此类错误。

MySQL- Out of range value for column 'bills_amount'

这个问题爆出来第一感觉就是数值大小大于数据库定义变量的最大存储值。

问题描述:

从"A"表获取amount 字段塞入"B"表bills_amount  字段,但是塞入时报如下异常信息:

1、Error updating database.  Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'bills_amount' at row 17

2、Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'bills_amount' at row 17

这个错误看着是大于最大值范围,但是确认后发现没达到最大值

amount:bigint

bills_amount:bigint(11) unsigned

 发现两个区别,一个是有符号,一个是无符号,有符号的能存储负数而无符号的不能存储负数所以在无符号字段存入负数报一个Out of range value 的异常。

import tkinter as tk from tkinter import messagebox def min_bills(amount): # 纸币面值及对应的名称 bills = [1000, 500, 200, 100, 50, 20, 10] # 单位:角 bill_names = ["10元","5 元", "2 元", "1 元", "5 角", "2 角", "1 角"] result = [] for i, bill in enumerate(bills): # 计算当前最大纸币的使用数量 count = int(amount // bill) # 计算剩余金额 amount -= count * bill result.append((bill_names[i], count)) if amount == 0: break if amount == 0: return result else: return None def calculate_change(): try: # 获取输入的金额 total_amount = float(entry_total.get()) * 100 # 转换为角 paid_amount = float(entry_paid.get()) * 100 # 转换为角 # 计算找零金额 change_amount = paid_amount - total_amount if change_amount < 0: messagebox.showerror("错误", "支付金额不足!") return # 计算最少找零方案 change_result = min_bills(change_amount) if change_result: result_text = "找零方案:\n" for bill, count in change_result: if count > 0: result_text += f"{bill}: {count} 张\n" messagebox.showinfo("找零结果", result_text) else: messagebox.showerror("错误", "无法用给定的纸币找零!") except ValueError: messagebox.showerror("错误", "请输入有效的金额!") # 创建主窗口 root = tk.Tk() root.title("超市现金收支找零系统") root.geometry("300x250") # 创建标签和输入框 label_total = tk.Label(root, text="商品总价(元):") label_total.pack() entry_total = tk.Entry(root) entry_total.pack() label_paid = tk.Label(root, text="支付金额(元):") label_paid.pack() entry_paid = tk.Entry(root) entry_paid.pack() # 创建计算按钮 button_calculate = tk.Button(root, text="计算找零", command=calculate_change) button_calculate.pack() # 运行主循环 root.mainloop()再添加一个金额不足应给多少的部分
最新发布
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值