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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值