背景
今天在做项目时,往一张表中插入了数据,表的ID字段默认是bigint类型。vue在将该条数据取出展示到前端时,ID却自动给我改变了!
也就是我数据库保存的是一个ID,前端展示的却是另外一个ID。真是奇了怪了!打印下sql语句,看看查询出来的ID是否有问题?没问题! 打印下前端获取到数据是否有问题?有问题!此时已经与后端查询出来的ID不一致了!
解决
通过查询资料,发现该问题产生原因是JavaScript不支持后台返回的Long类型,JavaScript的number类型的数值范围是-2^53~2^53(不包含边界) 所以大于 9007199254740991 的数在进制转换时会存在精度问题,而雪花ID生成的数值过大,导致JavaScript不能正常存储导致。
注意: 雪花ID在数据库中建议使用bigint来存储,不要用char或者varchar,否则会降低索引查询的效率。
后端两种解决方式。
解决1:将ID列的数据类型改为char或者把varchar类型。
解决2:在实体类do中将id类型,自动进行一个类型转换。使用Jackson的@JsonFormat做类型转换。