永发信息网

Mysql 字段 数据溢出问题 如何解决

答案:4  悬赏:80  手机版
解决时间 2021-02-25 17:50
当test表中 b字段 数据类型为int(10) , 数据属性为UNSIGNED , 数值为0时,执行 update `test` set b=b-1 where a = 1 。
测试数据库Mysql提示:#1264 - Out of range value adjusted for column 'b' at row 1
线上数据库Mysql会执行并数据字段数据溢出4294967295

已经找出什么原因导致的了~~~ 谢谢
最佳答案
不知道你是oracle还是sql server?这个是个自连接问题,先要排序,标行号,再同表的上下行相比,所以是自连接
orcale:
select a.vseq,a.declaredate as declaredate1,b.declaredate as declaredate2
from
(select vseq,declaredate,rownum as row from mac505 order by vseq,declaredate)a,
(select vseq,declaredate,rownum as row from mac505 order by vseq,declaredate)b
where a.vseq=b.vseq and a.row+1=b.row and a.declaredate+1000
sql server由于只有2005以上版本才有row_number()函数,所以如下脚本只能用在2005以上版本中
select a.vseq,a.declaredate as declaredate1,b.declaredate as declaredate2
from
(select vseq,declaredate,row_number() orver (order by vseq,declaredate) as row from mac505 )a,
(select vseq,declaredate,row_number() orver (order by vseq,declaredate) as row from mac505 )b
where a.vseq=b.vseq and a.row+1=b.row and a.declaredate+1000
全部回答
  • 1楼网友:玩家
  • 2021-02-25 16:41
update `test` set b=b-1 where a = 1中 如果这时b=0 set里 b=b-1= -1,UNSIGNED无符号类型 必须大于等于0,
  • 2楼网友:人類模型
  • 2021-02-25 16:31
取绝对值的方式如下 update `test` set b=abs(b-1) where a = 1 。 如果是小于0是都为0的那种,你就应该在程序里执行该语句前进行判断。
  • 3楼网友:爱难随人意
  • 2021-02-25 15:48
新版本的MySQL对字段的严格检查。 解决方法(两种方法任选一种即可): 1、修改my.ini,将 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 改为 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯