0
点赞
收藏
分享

微信扫一扫

MySQL忽略大小写的注意事项

一、背景

在阿里的规范中,不允许超过2个JOIN的关联查询,故项目中需要将复杂SQL拆分

二、问题

目前MySQL5.7非特殊场景默认选择utf8mb4,排序选择utf8mb4_general_ci,MySQL8默认选择utf8mb4_0900_ai_ci

当我们使用拆分小查询时,往往使用IN来批量,避免频繁请求、拆解包、解析、执行,这时候我们需要将唯一建以Map的Key形式返回

List<Company> companyList = companyService.list();
List<String> codeList = companyList.stream()
.map(Company::getCode)
.collect(Collectors.toList());

Map<String, List<Client>> clientByComCode = clientService.getByCompanyCode(codeList);

companyList.foreach(o -> {
String companyCode = o.getCode();
List<Client> clientList = clientByComCode.get(companyCode);
})

由于Client是对接第三方的数据,未知的原因造成一部分Code是大写,一部分是小写,在clientService查询时都能命中,但是clientByComCode的get方法无法命中,就形成一种MySQL不区分大小写,但是Java中是区分的

三、解决

  1. 所有数据入库的时候都转成大写
  2. 在查询返回时用函数转成大写,查询时也用大写
  3. 重写Map类或者Map工具类,支持忽略大小写
举报

相关推荐

0 条评论