当前位置:数据库 > MySQL >>

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

当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
补充:已经找出什么原因导致的了~~~ 谢谢
追问:如果设置UNSIGNED如果结果小于0 应该是 不执行或这报错。程序是可以解决的,想知道mysql的什么设置会导致,测试服务器和线上服务器处理方式不同。跟sql-mode有关系吗?怎么能通过mysql解决
答案:不知道你是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<b.declaredate

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<b.declaredate
其他:update `test` set b=b-1 where a = 1中
如果这时b=0 set里 b=b-1= -1,UNSIGNED无符号类型 必须大于等于0, 取绝对值的方式如下
update `test` set b=abs(b-1) where a = 1 。

如果是小于0是都为0的那种,你就应该在程序里执行该语句前进行判断。 新版本的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"。
重新启动MySQL。
2、在执行sql语句前,先执行以下语句:
mysql_query("set sql_mode=''"); 

上一个:【mysql数据库还原】mysql数据库备份下来是 .gz的格式,请问怎么还原啊?
下一个:mysql数据库表修改某一列的类型

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,