关于Mysql、MyBatis使用Gourp By、IFNULL、UUID函数无效的问题

在Mysql中有些场景要在group by 中不对 null 数据做分组

场景示例:
在这里插入图片描述

在网络上解决方式都是用GROUP BY IFNULL(字段,UUID())这种方式来排除null数据的合并分组

参考链接:https://zhuanlan.zhihu.com/p/424172896

UUID():此函数是生成唯一的ID值,通常用来生成主键
IFNULL(A,B): 如果A是空的那么IFNULL的结果就是B,反之A不为空那么IFNULL的结果就是A
IFNULL()与UUID()组合使用就可以在group by分组时将null空数据生成一个唯一的ID,这样一来,每个null数据都会有一个唯一的ID,就不会合并在一起了。

但是!!!!

我们在Mysql执行一下GROUP BY IFNULL(字段,UUID())这种方式发现:
在这里插入图片描述

我们在Mysql使用GROUP BY IFNULL(字段,UUID())时会没有效果,这是为什么呢?

经过一番研究因为在使用IFNULL(字段,UUID())时UUID()生成的ID值都是一样的,所以没有效果
在这里插入图片描述

为什么使用UUID()生成的ID都是一样?

我在网络上找到了很多种解释:
有的说Mysql字符集出了问题,要将Mysql字符集修改成UTF-8的;

参考链接:https://blog.csdn.net/weixin_42514562/article/details/113233270

有的说是navicat工具上显示id 重复 而在MySQL Client可以正常执行,是navicat工具有问题;

参考链接:https://www.freesion.com/article/5966548260/

有的直接给出了解决方案,就是UUID()用MD5()包起来,就是写成IFNULL(字段,MD5(UUID()))

参考链接:https://zhuanlan.zhihu.com/p/159060930

前两种解决方案我都尝试过发现没有作用,最后一种解决方案把IFNULL(字段,UUID())
换成IFNULL(字段,MD5(UUID()))之后在mysql执行成功了
在这里插入图片描述
证明此方法有效,所以就将IFNULL(字段,MD5(UUID()))放到了Mybatis的xml中使用了

注意!!!!

很奇怪的是,在Mybatis执行却不生效,输出的语句确实是正确的,但是在Mybatis执行还是会把null合并在一起了,没有将null数据通过UUID()生成唯一的ID分开。
在这里插入图片描述在这里插入图片描述

最后解决方案!!!!

通过一番尝试,将MD5(UUID())改成了UUID_SHORT(),则写成IFNULL(字段, UUID_SHORT())
在这里插入图片描述
在这里插入图片描述

UUID_SHORT():与UUID()一样,只不和UUID()返回的长度字符串不同

最后问题解决,如果你项目中使用了Mysql和Mybatis,然后也碰到了group by 中不对 null 数据做分组的需求,就直接用 GROUP BY IFNULL(字段, UUID_SHORT()) 即可!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值