1、问题
在个人的开发工作中,遇到问题:当时在CRM的客户列表中,拉取客户所属人下拉框功能时,发现系统加载所有用户名称名单,如下图。
解决前原图
问题来了,业务员名称在下拉框的列表中,并没有按照正常惯例以拼音正序进行排序,尤其时名单较多时,不易找到目标名称,影响用户的使用体验。
2、排查
起初以为代码中没有指定排序规则,随后在相应的代码处增加字段排序,以其中一处的代码如例:
public List<MemberPO> queryCompanyAllMemberIds() {
QueryWrapper<MemberPO> queryWrapper = new QueryWrapper();
queryWrapper.orderByAsc("name_cn");
List<MemberPO> memberPOList = memberMapper.selectList(queryWrapper).stream().collect(Collectors.toList());
return memberPOList;
} |
将对应的SQL在数据库执行,运行后,依然没有生效。
经查询资料,发现问题在于字段的字符集。当前的整个数据库字符集默认是utf8,当需要对有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时),默认无法直接通过Order By关键字正确排序。
如果是字符集是GBK时,可以直接通过汉字的拼音排序。
3、解决
知道问题本质原因后,修改代码后代码如下:
public List<MemberPO> queryCompanyAllMemberIds() {
QueryWrapper<MemberPO> queryWrapper = new QueryWrapper();
queryWrapper.last("ORDER BY CONVERT ( name_cn USING gbk ) ASC");
List<MemberPO> memberPOList = memberMapper.selectList(queryWrapper).stream().collect(Collectors.toList());
return memberPOList;
} |
重启后,效果图如下
解决后效果图
4、引申
如果哪天出现需要按照汉字笔画进行排序怎么办?
MySQL不支持汉字笔画排序的,基本都是按照自然语言来排序的。
但是可以变换一下思路,比如:
首先新建一个表,表中存姓氏和笔画数,然后在目标表中添加一个存笔画的字段,这样搜索的时候就可以按照笔画来排序了。