mysql修改字段类型为smallint_mysql更新 unsigned 的 smallint 类型字段出现65535

$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'


版权声明:本文为weixin_42371574原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。