MySQL 无符号整数
credit INT UNSIGNED;
假设当前credit 字段当前值为0,执行以下语句
update bonus set credit=credit-100 where id=185181 (mysql 5.1)
credit的值变为4294967295,int 的存储范围是-2147483648 - 2147483647, 但对于无符号int存储范围是0-4294967295, credit字段存储不了负数,就会产生溢出,变成了正数的最大值。
在业务中这个数据将会是致命的错误。
特别是并发执行或产生死锁时,同时更新数据容易出现此问题,不是线程安全的,要从根本上处理逻辑上杜绝此类语句执行,且在执行时加以判断。
以上语句在mysql 5.7执行提示 "BIGINT UNSIGNED value is out of range in xxx" ,看似有安全提升,但不能保证绝对安全。慎重。
浙公网安备 33010602011771号