mysql隐式转换导致的越界bug
之前用触发器做数据统计
然后还是一不小心踩坑了
触发器新建了一张fileinfo表,file表中增删查改的信息都会以触发器的形式去修改fileinfo表
后来发现由于mysql是行级锁,由于file表的操作QPS会很高,这个行级锁会造成很大的性能损失
所以需要把增删查改写入随机行。
首先需要新加一个NoUseId字段,这个字段就是随机值匹配的字段
然后需要把原先的UploadSize从unsigned变成signed。
因为如果删除的时候,update的那一行可能会从正数变成负数
1 | create table if not exists `fileinfo` ( |
1 | delimiter // |
很快就报错了
1 | meta insert failed Error 1690: BIGINT UNSIGNED value is out of range in '(`POLKA_META_3393`.`fileinfo`.`UploadSize` + NEW.Size)' |
这个报错和C的有符号和无符号相加有点类似,没想到mysql也会有这样的问题:
无符号数和有符号数相加的结果,会默认转换成无符号数
做一个小测试
1 | mysql> CREATE TABLE t ( a INT UNSIGNED, b INT SIGNED ); |
因此如下修改
1 | delimiter // |
总结
mysql涉及到符号数加减,一定要自己通过convert转换,排除mysql自己的隐式转换规则