mysql int字段 被转成Long问题解决

注意避坑啦!

最近我和春春遇到了枚举类无法正常从数据库中取出的问题
表象就是NewOrderStatus newOrderStatus这个枚举字段一直都是null,但是同一个do中的其他枚举字段都是正常取出的。

没办法只能逐层排查,最终定位到了问题,在枚举处理器中,我们看到code的Class是Long,看来问题应该就是mysql驱动从数据库中取字段类型有偏差导致的。

op image.png

再往深层找,我们能够看到,在com.mysql.jdbc.ResultSetImpl#getObject(int)这个方法里面从数据库中取出的字段经过处理变成了程序拿到的数据对象。
op image.png

我们可以来品一品它对字段的处理和判断

op image.png

在这里我们可以看到如果你的SQLType是int并且字段是无符号的,那么当字段的mysqlType属性不是Int类型就会被转成Long

op image.png
我们可以看到它的确被识别成了mysql里的long即使它只是个 unsigned int(1)

今天太晚了,明天有空可以整理一下可能有哪些字段组合可能导致这样的问题。

 

原因: 刚反应过来了为啥了,其实原因很简单,java中的Integer是有符号的从 -2^31~2^31-1,mysql中的有符号整型应该也是4字节储存的——虽然限制了位数(实际上好像没有用啊,这个点需要再研究一下)——那么如果mysql中储存了无符号的int,就会导致java中的Integer溢出,那么unsigned int被转成Long就非常合理且安全了。

总结一下,就是在mysql中慎用unsigned,最好能够明确有无符号需求的时候再用吧;或者枚举类统一使用tinyint也能够解决问题,就是不要使用tinyint(1),因为那又是另外一个坑。


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