解决中文名单按拼音排序的问题

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不支持汉字笔画排序的,基本都是按照自然语言来排序的。

但是可以变换一下思路,比如:

首先新建一个表,表中存姓氏和笔画数,然后在目标表中添加一个存笔画的字段,这样搜索的时候就可以按照笔画来排序了。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页