$sql = "UPDATE `dzxbbs_common_member` SET newprompt=newprompt-1 WHERE uid='{$uid}'";
`dzxbbs_common_member` 表中 newprompt的类型是 smallint unsigned 长度为6的类型。
当newprompt值为0时,执行这条sql语句,得到了意想不到的结果newprompt字段值变成了65535。
出现这个问题的服务器版本是 mysql 5.1.38-log。
解决这个需要设置这个参数 sql_mode="NO_UNSIGNED_SUBTRACTION" 启用这个选项后两个UNSIGNED类型相减返回SIGNED类型。
我在本地测试的结果是报错
#1690 – BIGINT UNSIGNED value is out of range in '(`test`.`test`.`view` – 1)'
服务器版本: mysql 5.5.16
开源电商系统ecshop商品库存也存在突然变成65535的问题。
Mysql5 为了速度,只存放数二进制数据,而且在加减运算中,也是二进制的运算.
所以在使用unsigned 是小心0-1 的操作.尽量在这类操作前先做一个判断.
如果直接在程序里进行判定,难免会出现数据错误,因为有一点点时间内数据是放在内存的,而没放进库里,最好的办法还是直接送出sql语句进行修改,这里mysql5有解决办法 CONVERT( 字段 + (要加减的数字) AS SIGNED )就可以了。
例如:UPDATE `user` SET `tk` = CONVERT( tk + (-8) ,SIGNED ) WHERE `id` = '133'