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

  • Post author:
  • Post category:mysql




在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())

即可!



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